Acho que freqz
em uma caixa de ferramentas MATLAB é a maneira de obter DTFT de sequência. freqz
pode calcular a resposta de frequência de:
H (z) = (Num) / (Den)
Podemos calcular facilmente a transformada z de qualquer sequência finita x(n)
assim:
H (z) = x (0) z ^ 0 + x (1) z ^ 1 + …
Sabemos na expressão acima que Den
é 1.
Lembrando que: freeqz(num,den,n)
fornece a resposta ao degrau no ponto n. Por x ser o vetor de x (n),
[x1freqz, x1freqzw]=freqz(x,1,3000,"whole");
deve nos fornecer o DTFT.
1) É (declaração acima) correto? o que acontecerá se mudarmos nosso polinômio ?? por quê?
A segunda maneira é calcular a fórmula DTFT completamente, assim:
[X, W]=me_dtft(x1",pi,3000); figure title("my") % plot(W/pi,20*log10(abs(X))); plot(W/pi,abs(X)) ax = gca; % ax.YLim = [-40 70]; xlabel("Normalized Frequency (\times\pi rad/sample)") ylabel("Magnitude (dB)") function [X, w]=me_dtft(x,whalfrange, nsample) w= linspace(-whalfrange,whalfrange,nsample); t=0:1:size(x,2)-1; X=zeros(1,size(w,2)); for i=1:1:size(w,2) X(i)=x*exp(-t*1i*w(i))"; end end
2) Eu confundi, é o intervalo de parâmetro t
no código acima, importante?
3) Esta implementação está correta? Por quê?
Acho que deve haver dissonância, já que a imagem: Nos dizendo algo errado! Essas transformadas são obtidas da onda senoidal pura (seu código na imagem), à direita você pode ver o fft
, freqz
pelo maneira explicada em cima e (à esquerda) a DTFT conforme explicado anteriormente.
Editar após o comentário de “Jason R”: Ok, também removi a escala logarítmica, pois isso me deixa confuso. Depois disso, intuitivamente iguais, como você pode ver na próxima imagem, mas por que eles não são exatamente os mesmos (consulte a última imagem pela escala logarítmica?)?
freqz
:
[x1freqz, x1freqzw]=freqz(fliplr(XX"),1,3000,"whole"); figure title("freqz") % plot((x1freqzw/pi)-1,20*log10(abs(fftshift(x1freqz)))) plot((x1freqzw/pi)-1,abs(fftshift(x1freqz))) ax = gca; % ax.YLim = [-40 70]; ax.XTick = -1:.5:2; xlabel("Normalized Frequency (\times\pi rad/sample)") ylabel("Magnitude")
Amostra senoidal:
Fs=1000; Ts=1/Fs; time=0:Ts:1; Freqs=500; Xs=zeros(length(Freqs),length(time)); for i=1:length(Freqs) Xs(i,:)= cos(2*pi*Freqs(i)*time); end XX=Xs; XX=XX./ max(abs(XX)); figure;plot(time, XX); axis(([0 time(end) -1 1])); xlabel("Time (sec)"); ylabel("Singal Amp."); title("A sample audio signal"); sound(XX,Fs)
Comentários
- Você deve postar um script completo que gere os gráficos que você deu.
- Uma diferença é que vejo que em seu código você está traçando o DTFT de -fs / 2 a + fs / 2 enquanto o FFT vai de 0 a fs em comparação. (Mas você pode usar ” fft shitt “) Sem ver todo o seu código, suspeito que a diferença nos dois gráficos é o erro de arredondamento que seria reduzido incluindo mais pontos e / ou indo para flutuadores de precisão dupla. Observe que o DTFT será uma função Sinc da qual o FFT será uma amostra, a menos que você crie uma onda senoidal com uma frequência que seja um sub-múltiplo inteiro da taxa de amostragem. Saiba também que você pode obter amostras do DTFT preenchendo com zeros o FFT.
- @DanBoschen na figura fft, 1000 significa fs / 2?
- Não 1000 significa fs, sua forma de onda está em fs / 2
- @DanBoschen Você pode explicar mais por que eles (meu DTFT e freqz, quero dizer) não são exatamente os mesmos? Se eu preencher o fft, sinc aparecerá?
Resposta
A função linspace usada vai de – fs / 2 a + fs / 2 para 3.000 amostras, portanto, + fs / 2 está sendo contado duas vezes. Em contraste, o FFT e freqz, que vai de 0 a N-1, não duplicam os dois pontos finais (neste caso, eles vão de DC para 1 bin a menos que fs, onde fs é a taxa de amostragem). Portanto, as localizações das amostras não são exatamente as mesmas, levando à diferença observável nos dois métodos freqz.
Além disso, você pode obter amostras da DTFT por preenchimento de zero como outra opção: fft (x, 3000).
Em vez de linspace, que funcionará bem se você escolher o início e a parada adequados, eu gosto de fazer:
t = [0: length (x) -1] * 1 / fs
Comentários
- Sim, para responder à sua segunda pergunta, acredito que sua abordagem está correta. Depois de corrigir os locais de amostra, os resultados devem corresponder
- Esse ‘ s funcionou muito bem, mas minha segunda pergunta foi: 2) Eu confundi, é o intervalo de parâmetro t no código acima, importante?
- Ah entendo — Bem, o intervalo de t é o número de amostras. Você substituiu os 512 samples padrão em freqz para 3000, por exemplo, o que deu a você mais samples do mesmo DTFT. Dito isso, o intervalo não ‘ t muda a resposta para as amostras que você escolhe, mas fornece mais amostras em seus resultados. Por exemplo, mesmo no seu caso em que você teve duas respostas diferentes porque as amostras estavam em valores t ligeiramente diferentes, em ambos os casos você estava vendo o mesmo DTFT, apenas localizações ligeiramente diferentes na mesma curva (contínua). (O DTFT é uma função contínua de frequência).
- Acho que você explicou o
w
parâmetro, nãot
, não é ‘ isso?t
deve substituir os índices do sinal de tempo, mas o índice pode ser conduzido separadamente det
no exponencial.podemos usar diferentest
como usados no índice do nosso sinal, em um esquema melhor, podemos mudar esse intervalo antes de calcular o exponencial, o que ‘ s é ‘ s impacto? - Em sua fórmula, t deve ter o mesmo comprimento que x. Se você aumentar o número de amostras em t, deverá ter mais amostras em x, o que significa mais precisão de frequência em seu DTFT (o padrão Sinc que você vê na frequência terá nulos mais próximos). Quando o número de amostras em x, t e frequência coincidem, você está computando o DFT (embora o caminho Longo em comparação com o FFT — razão pela qual um FFT com zero preenchido seria uma abordagem muito mais eficiente para você calcular amostras do DTFT, ou apenas use freqz como você fez)