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: tu wpisz opis obrazu 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?)? enter opis obrazu tutaj

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 nie t, czy nie ' czy to nie jest to? t musi nadpisywać indeksy sygnału czasu, ale indeks może być sterowany oddzielnie od t w funkcji wykładniczej.możemy użyć innego t 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)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *