Myślę, że freqz
w zestawie narzędzi MATLAB jest sposobem na uzyskanie DTFT sekwencji. freqz
może obliczyć charakterystykę częstotliwości:
H (z) = (Num) / (Den)
Możemy łatwo obliczyć transformację Z dowolnej skończonej sekwencji x(n)
w następujący sposób:
H (z) = x (0) z ^ 0 + x (1) z ^ 1 + …
W powyższym wyrażeniu wiemy, że Den
to 1.
Przypominając: freeqz(num,den,n)
podaje odpowiedź skokową w punkcie n. Przez x być wektorem x (n),
[x1freqz, x1freqzw]=freqz(x,1,3000,"whole");
musi dać nam DTFT.
1) Czy to (powyższe stwierdzenie) poprawny? co się stanie, jeśli zmienimy nasz wielomian? dlaczego?
Drugi sposób polega na całkowitym obliczeniu wzoru DTFT, w ten sposób:
[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) Jestem zdezorientowany, czy zakres parametr t
w powyższym kodzie, ważny?
3) Czy ta implementacja jest prawidłowa? Dlaczego?
Myślę, że musi być dysonans, skoro na obrazku: Mówi nam coś złego! Te transformacje są pobierane z czystej fali sinusoidalnej (jej kod na rysunku), od prawej strony możesz zobaczyć fft
, freqz
przy sposób wyjaśniony na górze i (po lewej) DTFT, jak wyjaśniono wcześniej.
Edytuj po komentarzu „Jasona R”: Ok, usunąłem też skalę logarytmiczną, ponieważ wprawia mnie to w zakłopotanie. Po tym, intuicyjnie podobnie, jak widać na następnym obrazku, ale dlaczego nie są dokładnie takie same (odwołać się do ostatniego obrazu w skali logarytmicznej?)?
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")
Próbka sinusowa:
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)
Komentarze
- Powinieneś opublikować kompletny skrypt, który generuje wykresy, które
- Jedyną różnicą jest to, że widzę, że w swoim kodzie wykreślasz DTFT od -fs / 2 do + fs / 2, podczas gdy FFT zmienia się od 0 do fs w porównaniu. (Ale możesz użyć " fft shitt ") Nie widząc całego kodu, podejrzewam, że różnica w obu wykresach jest błędem zaokrągleń, który zostałby zmniejszony przez dodanie większej liczby punktów lub przejście do zmiennoprzecinkowych o podwójnej precyzji. Zwróć uwagę, że DTFT będzie funkcją Sinc, której FFT będzie próbkami, chyba że utworzysz falę sinusoidalną o częstotliwości będącej całkowitą wielokrotnością częstotliwości próbkowania. Wiedz również, że możesz pobrać próbki DTFT, wypełniając FFT zerami.
- @DanBoschen na figurze fft, 1000 oznacza fs / 2?
- Nie 1000 oznacza fs, twój przebieg jest na fs / 2
- @DanBoschen Czy możesz wyjaśnić więcej, dlaczego (mam na myśli moje DTFT i freqz) nie są dokładnie takie same? Jeśli uzupełnię fft, pojawi się sinc?
Odpowiedź
Używana funkcja linspace przechodzi z – fs / 2 do + fs / 2 dla 3000 próbek, więc + fs / 2 jest liczone dwukrotnie. W przeciwieństwie do tego FFT i freqz, które przechodzą od 0 do N-1 nie powielają dwóch punktów końcowych (w tym przypadku przechodzą od DC do 1 bin mniej niż fs, gdzie fs jest częstotliwością próbkowania). Dlatego lokalizacje próbek nie są dokładnie takie same, co prowadzi do różnicy obserwowalnej w dwóch metodach freqz.
Ponadto możesz pobrać próbki DTFT przez wypełnienie zerami jako inną opcję: fft (x, 3000).
Zamiast linspace, który będzie działał dobrze, jeśli wybierzesz właściwy początek i koniec, lubię to robić:
t = [0: length (x) -1] * 1 / fs
Komentarze
- Tak, odpowiadając na drugie pytanie. Uważam, że Twoje podejście jest poprawne. Po poprawieniu przykładowych lokalizacji wyniki powinny być zgodne
- To, że ' działało całkiem nieźle, ale moje drugie pytanie brzmiało: 2) Nie wiem, czy zakres parametr t w powyższym kodzie, ważny?
- Ah, widzę — Cóż, zakres t to liczba próbek. Zastąpiłeś domyślne 512 próbek w częstotliwości, na przykład 3000, co dało więcej próbek tego samego DTFT. To powiedziawszy, zakres nie ' nie zmienia odpowiedzi dla wybranych próbek, ale daje więcej próbek w wynikach. Na przykład, nawet w twoim przypadku, gdy miałeś dwie różne odpowiedzi, ponieważ próbki miały nieco różne wartości t, w obu przypadkach widziałeś ten sam DTFT, tylko nieco różne lokalizacje na tej samej (ciągłej) krzywej. (DTFT jest ciągłą funkcją częstotliwości).
- Myślę, że wyjaśniłeś parametr
w
, a niet
, czy nie ' czy to nie jest to?t
musi nadpisywać indeksy sygnału czasu, ale indeks może być sterowany oddzielnie odt
w funkcji wykładniczej.możemy użyć innegot
używanego w indeksie naszego sygnału, w lepszym schemacie możemy przesunąć ten zakres przed obliczeniem wykładniczym, co ' Czy to ' wpływ? - W Twoim wzorze t musi mieć taką samą długość jak x. Jeśli zwiększysz liczbę próbek wt, musisz mieć więcej próbek wx, co oznacza większą precyzję częstotliwości w twoim DTFT (wzór Sinc, który widzisz w częstotliwości, będzie miał zera bliżej siebie). Kiedy liczba próbek w x, t i częstotliwości jest zgodna, obliczasz DFT (chociaż długa droga w porównaniu do FFT – dlatego FFT wypełniony zerami byłby znacznie bardziej wydajnym podejściem do obliczania próbek DTFT lub po prostu użyj freqz, tak jak masz)