Je pense que freqz
dans une boîte à outils MATLAB, est le moyen dobtenir DTFT de séquence. freqz
peut calculer la réponse en fréquence de:
H (z) = (Num) / (Den)
Nous pouvons facilement calculer la transformation en z de toute séquence finie x(n)
comme ceci:
H (z) = x (0) z ^ 0 + x (1) z ^ 1 + …
Nous savons dans lexpression ci-dessus que Den
, est 1.
Rappelant que: freeqz(num,den,n)
donne la réponse échelonnée en n point. Par x être vecteur de x (n),
[x1freqz, x1freqzw]=freqz(x,1,3000,"whole");
doit nous donner le DTFT.
1) Est-ce (instruction ci-dessus) correct? que se passe-t-il si nous décalons notre polynôme ?? pourquoi?
La deuxième façon est de calculer complètement la formule DTFT, comme ceci:
[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) Jai confondu, est la plage de paramètre t
dans le code ci-dessus, important?
3) Cette implémentation est-elle correcte? Pourquoi?
Je pense quil doit y avoir une dissonance, puisque limage: Nous dire quelque chose de mal! Ces transformées sont prises à partir dune onde sinusoïdale pure (son code dans limage), de droite vous pouvez voir le fft
, freqz
par manière expliquée en haut et (à gauche) le DTFT comme expliqué précédemment.
Modifier après le commentaire de « Jason R » « : Ok, aussi jai supprimé léchelle logarithmique, car cela me rend confus. Après cela, intuitivement vous êtes semblables, comme vous pouvez le voir dans limage suivante, mais pourquoi ils ne sont pas exactement les mêmes (se référer à la dernière image par échelle logarithmique?)?
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")
Exemple sinusoïdal:
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)
Commentaires
- Vous devez publier un script complet qui génère les graphiques que vous
- Une différence est que je vois que dans votre code, vous tracez le DTFT de -fs / 2 à + fs / 2 tandis que la FFT passe de 0 à fs en comparaison. (Mais vous pouvez utiliser » fft shitt « ) Sans voir tout votre code, je soupçonne que la différence entre les deux graphiques est une erreur darrondi qui serait réduite en incluant plus de points et / ou en passant à des flotteurs à double précision. Notez que le DTFT sera une fonction Sinc dont la FFT sera des échantillons, sauf si vous créez une onde sinusoïdale avec une fréquence qui est un sous-multiple entier de la fréquence déchantillonnage. Sachez également que vous pouvez obtenir des échantillons du DTFT en remplissant à zéro la FFT.
- @DanBoschen en fft figure, 1000 signifie fs / 2?
- Non 1000 signifie fs, votre forme donde est à fs / 2
- @DanBoschen Pouvez-vous expliquer plus en détail pourquoi ils (mon DTFT et ma fréquence, je veux dire) ne sont pas exactement les mêmes? Si je remplis le fft, sinc apparaîtra?
Answer
La fonction linspace utilisée va de – fs / 2 à + fs / 2 pour 3000 échantillons donc le + fs / 2 est compté deux fois. En revanche, la FFT et la fréquence, qui va de 0 à N-1, ne dupliquent pas les deux extrémités (dans ce cas, elles vont de DC à 1 bin de moins que fs où fs est le taux déchantillonnage). Par conséquent, les emplacements des échantillons ne sont pas exactement les mêmes, ce qui conduit à la différence observable dans les deux méthodes freqz.
De plus, vous pouvez obtenir des échantillons du DTFT par remplissage nul comme une autre option: fft (x, 3000).
Au lieu de linspace qui fonctionnera très bien si vous choisissez le bon début et larrêt, jaime faire:
t = [0: length (x) -1] * 1 / fs
Commentaires
- Oui pour répondre à votre deuxième question, je pense que votre approche est correcte. Une fois que vous avez corrigé les emplacements des échantillons, les résultats devraient correspondre
- Que ‘ fonctionnait plutôt bien, mais ma deuxième question était: 2) Jai confondu, est la plage de paramètre t dans le code ci-dessus, important?
- Ah je vois — Et bien la plage de t est le nombre déchantillons. Vous avez remplacé les 512 échantillons par défaut en fréquence par exemple 3000, ce qui vous a donné plus déchantillons du même DTFT. Cela dit, la plage ne change pas ‘ la réponse pour les échantillons que vous choisissez, mais vous donne plus déchantillons dans vos résultats. Par exemple, même dans votre cas où vous aviez deux réponses différentes parce que les échantillons étaient à des valeurs t légèrement différentes, dans les deux cas, vous voyiez le même DTFT, juste des emplacements légèrement différents sur la même courbe (continue). (Le DTFT est une fonction continue de la fréquence).
- Je pense que vous avez expliqué le paramètre
w
, et nont
, Nest-ce pas ‘?t
doit remplacer les index de signal de temps, mais lindex peut conduire séparément det
dans lexponentiel.nous pouvons utiliser différentst
comme utilisé dans lindex de notre signal, dans un meilleur schéma, nous pouvons décaler cette plage avant de calculer lexponentiel, ce que ‘ s est-il ‘ impact? - Dans votre formule, t doit être de la même longueur que x. Si vous augmentez le nombre déchantillons en t, vous devez avoir plus déchantillons en x, ce qui signifie plus de précision de fréquence dans votre DTFT (le modèle Sinc que vous voyez en fréquence aura des valeurs nulles plus rapprochées). Lorsque le nombre déchantillons dans x, t et la fréquence correspondent tous, vous calculez la DFT (bien que le long chemin par rapport à la FFT — cest pourquoi une FFT à zéro rembourré serait une approche beaucoup plus efficace pour calculer des échantillons du DTFT, ou utilisez simplement freqz comme vous lavez fait)