Úgy gondolom, hogy a MATLAB eszköztárában található freqz
a DTFT megszerzésének módja. a sorrend. freqz
kiszámíthatja a következő frekvenciaválaszokat:
H (z) = (Num) / (Den)
Könnyen kiszámíthatjuk bármely véges szekvencia z-transzformációját x(n)
így:
H (z) = x (0) z ^ 0 + x (1) z ^ 1 + …
A fenti kifejezésben tudjuk, hogy a Den
értéke 1.
Emlékeztetve arra, hogy: freeqz(num,den,n)
adja meg a lépés válaszát n pontban. Az x értéke legyen x (n) vektora,
[x1freqz, x1freqzw]=freqz(x,1,3000,"whole");
meg kell adnia a DTFT-t.
1) Ez (fenti állítás) helyes? mi történik, ha eltoljuk a polinomunkat ?? miért?
A második módszer a DTFT képlet teljes kiszámítása, így:
[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) Összezavarodtam, a A fenti kódban szereplő t
paraméter fontos?
3) Helyes ez a megvalósítás? Miért?
Szerintem disszonanciának kell lennie, mivel a kép: Valami rosszat mond nekünk! Ezeket az átalakításokat tiszta szinusz hullám veszi (kódja a képen), jobbról láthatja a fft
, freqz
módon elmagyarázta a DTFT tetejét és (balra) a korábbiakban leírtak szerint.
Szerkesztés a “Jason R” kommentje után: Rendben, én is eltávolítottam a logaritmikus skálát, mivel ez összezavar. Ezután intuitív módon hasonlóan, ahogy a következő képen is láthatja, de miért nem teljesen egyformák (lásd az utolsó képet logaritmikus skála szerint?)?
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")
Szinuszminta:
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)
Megjegyzések
- Teljes szkriptet kell közzétennie, amely létrehozza az Ön által készített cselekményeket adta.
- Az egyik különbség az, hogy azt látom, hogy a kódodban a DTFT-t -fs / 2-től + fs / 2-ig ábrázolod, míg az FFT 0-ról fs-re megy át összehasonlítva. (De használhatod " fft shitt ") Anélkül, hogy látnám az összes kódodat, gyanítom, hogy a két ábrán a különbség kerekítési hiba, amelyet csökkenteni lehetne, ha több pontot veszünk fel, vagy ha kettős pontosságú úszókat használunk. Vegye figyelembe, hogy a DTFT egy olyan Sinc függvény lesz, amelynek az FFT lesz a mintája, hacsak nem hoz létre olyan szinuszhullámot, amelynek frekvenciája a mintavételi frekvencia egész számának többszöröse. Tudd azt is, hogy a DTFT-ből az FFT nulla kitöltésével szerezhetsz be mintákat.
- @DanBoschen az fft ábrán, 1000 azt jelenti, hogy fs / 2?
- Nem: 1000 azt jelenti, hogy fs, a hullámformád az fs / 2-nél van
- @DanBoschen Meg tudná magyarázni többet, hogy miért (a DTFT és a freqz, mármint) nem teljesen egyformák? Ha kitöltöm az fft-t, megjelenik a sinc?
Válasz
A használt linspace függvény – fs / 2-től + fs / 2-ig 3000 minta esetén, így a + fs / 2-t kétszer számolják. Ezzel szemben az FFT és a frekvencia, amely 0-ról N-1-re megy, nem duplikálja a két végpontot (ebben az esetben a DC-ből 1 bin-re kevesebb, mint fs, ahol fs a mintavételi arány). Ezért a mintahelyek nem teljesen egyformák, ami a két freqz metódusban megfigyelhető különbséghez vezet.
További lehetőségként a DTFT mintáit nulla kitöltéssel kaphatja meg: fft (x, 3000).
A linspace helyett, amely jól fog működni, ha a megfelelő kezdést és megállást választja, szeretem csinálni:
t = [0: hossz (x) -1] * 1 / fs
Megjegyzések
- Igen a második kérdés megválaszolásához, úgy gondolom, hogy helyes a megközelítése. Miután kijavította a minta helyeit, az eredményeknek meg kell egyezniük
- Ez a ' s nagyon szépen működött, de a második kérdésem a következő volt: 2) Összezavarodtam, a t paraméter a fenti kódban, fontos?
- Ah látom — Nos, a t tartománya a minták száma. Az alapértelmezett 512 mintát frekvenciában felülírta például 3000-re, ami több mintát adott ugyanarról a DTFT-ről. Ennek ellenére a tartomány nem ' nem változtatja meg a választ a kiválasztott mintákra, de további mintákat ad az eredményekben. Például, még abban az esetben is, amikor két különböző válasza volt, mivel a minták kissé eltérő t értékeken voltak, mindkét esetben ugyanazt a DTFT-t látta, csak kissé eltérő helyeket ugyanazon (folyamatos) görbén. (A DTFT a frekvencia folyamatos függvénye).
- Azt hiszem, hogy a
w
paramétert magyarázta, nem pedig at
paramétert, nem ' ez? At
-nek felül kell írnia az időjel-indexeket, de az index külön vezethet az exponenciálist
-től.a jelünk indexében használt különbözőt
elemeket használhatjuk, jobb sémában ezt az értéket eltolhatjuk, mielőtt kiszámítanánk az exponenciális értéket, mi ' s ez ' hatással van? - A képletedben a t-nek azonos hosszúságúnak kell lennie, mint x. Ha növeli a minták számát t-ben, akkor több mintával kell rendelkeznie x-ben, ami nagyobb frekvencia pontosságot jelent a DTFT-ben (a frekvenciában látott Sinc mintának nullái közelebb vannak egymáshoz). Amikor az x, t és frekvencia minták száma megegyezik, akkor a DFT-t számítja (bár a Hosszú út az FFT-hez képest — ezért a nulla párnázott FFT sokkal hatékonyabb módszer lenne a minták kiszámításához vagy csak a freqz-t használja, ahogy van)