Myslím, že freqz v sadě nástrojů MATLAB, je způsob, jak získat DTFT sekvence. freqz dokáže vypočítat frekvenční odezvu:

H (z) = (počet) / (den)

Můžeme snadno vypočítat z-transformaci jakékoli konečné posloupnosti x(n) takto:

H (z) = x (0) z ^ 0 + x (1) z ^ 1 + …

Z výše uvedeného výrazu víme, že Den je 1.

Připomínáme, že: freeqz(num,den,n) dává krokovou reakci v bodě n. Tím, že x je vektorem x (n),

[x1freqz, x1freqzw]=freqz(x,1,3000,"whole"); 

musí nám dát DTFT.

1) Je to (výše uvedené prohlášení) opravit? co se stane, když posuneme náš polynom? proč?

Druhým způsobem je zcela vypočítat vzorec DTFT, například takto:

[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) Zmatil jsem, je rozsah parametr t ve výše uvedeném kódu, důležitý?

3) Je tato implementace správná? Proč?

Myslím, že musí existovat nesoulad, protože obrázek: zde zadejte popis obrázku Říká nám něco špatně! Tyto transformace jsou převzaty z čisté sinusové vlny (její kód na obrázku), zprava vidíte fft, freqz způsobem vysvětleno nahoře a (vlevo) DTFT, jak bylo vysvětleno dříve.

Upravit po komentáři „Jasona R“: Dobře, také jsem odstranil logaritmickou stupnici, protože mě to dělá zmatkem. Poté jsou intuitivně vaše podobně, jak vidíte na dalším obrázku, ale proč nejsou úplně stejné (viz poslední obrázek v logaritmickém měřítku?)? zadat popis obrázku zde

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") 

Ukázka sine:

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) 

Komentáře

  • Měli byste zveřejnit kompletní skript, který generuje grafy, které vy dal.
  • Jedním rozdílem je, že vidím, že ve svém kódu vykreslujete DTFT z -fs / 2 na + fs / 2, zatímco FFT jde ve srovnání z 0 na fs. (Ale můžete použít " fft shitt ") Aniž bych viděl celý váš kód, domnívám se, že rozdílem ve dvou grafech je chyba zaokrouhlování, která by byla snížena zahrnutím více bodů a nebo přechodem na plováky s dvojitou přesností. Všimněte si, že DTFT bude funkcí Sinc, jejíž FFT budou vzorky, pokud nevytvoříte sinusovou vlnu s frekvencí, která je celočíselným dílčím násobkem vzorkovací frekvence. Také víte, že můžete získat vzorky DTFT nulovým polstrováním FFT.
  • @DanBoschen na obrázku fft, 1000 znamená fs / 2?
  • Ne 1000 znamená fs, vaše křivka je na fs / 2
  • @DanBoschen Můžete mi vysvětlit více, proč (můj DTFT a freqz, myslím) nejsou úplně stejné? Pokud vyplním fft, objeví se sinc?

Odpovědět

Funkce linspace, jak je použita, vychází z – fs / 2 až + fs / 2 pro 3000 vzorků, takže + fs / 2 se počítá dvakrát. Naproti tomu FFT a freqz, které se pohybují od 0 do N-1, neduplikují dva koncové body (v tomto případě jdou z DC do 1 bin méně než fs, kde fs je vzorkovací frekvence). Proto ukázková umístění nejsou úplně stejná, což vede k rozdílu pozorovatelnému ve dvou freqz metodách.

Dále můžete získat vzorky DTFT nulovým polstrováním jako další možnost: fft (x, 3000).

Místo linspace, který bude fungovat dobře, pokud zvolíte správné spuštění a zastavení, chci udělat:

t = [0: length (x) -1] * 1 / fs

Komentáře

  • Ano, abych odpověděl na vaši druhou otázku Věřím, že váš přístup je správný. Jakmile opravíte umístění vzorků, výsledky by se měly shodovat
  • To ' s fungovalo docela hezky, ale moje druhá otázka byla: 2) Zmatil jsem, je rozsah parametr t ve výše uvedeném kódu, důležitý?
  • Ah vidím — Rozsah t je počet vzorků. Přeložili jste výchozí 512 vzorků ve frekvenci například na 3000, což vám dalo více vzorků stejného DTFT. To znamená, že rozsah ' t nezmění odpověď na vybrané vzorky, ale ve výsledcích vám poskytne více vzorků. Například i ve vašem případě, kdy jste měli dvě různé odpovědi, protože vzorky byly na mírně odlišných hodnotách t, v obou případech jste viděli stejný DTFT, jen mírně odlišná místa na stejné (spojité) křivce. (DTFT je spojitá funkce frekvence).
  • Myslím, že jste vysvětlili parametr w, ne t, to není ' to? t musí přepsat indexy časových signálů, ale index může řídit odděleně od t v exponenciálu.můžeme použít různé t jak se používá v indexu našeho signálu, v lepším schématu můžeme tento rozsah posunout před výpočtem exponenciálu, co ' s ' s dopadem?
  • Ve vašem vzorci musí mít t stejnou délku jako x. Pokud zvýšíte počet vzorků v t, musíte mít více vzorků v x, což znamená větší přesnost frekvence ve vašem DTFT (vzor Sinc, který vidíte na frekvenci, bude mít nuly blíže k sobě). Když se počet vzorků v x, t a frekvenci shodují, počítáte DFT (ačkoli Long way oproti FFT — což je důvod, proč by FFT s nulovým polstrováním byl mnohem efektivnějším přístupem k výpočtu vzorků DTFT, nebo stačí použít frekvenci, jakou máte)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *