Cred că freqz într-o cutie de instrumente MATLAB, este modalitatea de a obține DTFT de succesiune. freqz poate calcula răspunsul în frecvență al:

H (z) = (Num) / (Den)

Putem calcula cu ușurință transformata z a oricărei secvențe finite x(n) astfel:

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

Știm în expresia de mai sus că Den este 1.

Amintind că: freeqz(num,den,n) dă răspunsul pasului în punctul n. Prin x să fie vectorul lui x (n),

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

trebuie să ne ofere DTFT.

1) Este (afirmația de mai sus) corect? ce se întâmplă dacă ne schimbăm polinomul ?? de ce?

A doua modalitate este de a calcula formula DTFT complet, astfel:

[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) Am confuz, este intervalul de parametru t din codul de mai sus, important?

3) Este corectă această implementare? De ce?

Cred că trebuie să existe disonanță, deoarece imaginea: introduceți descrierea imaginii aici Ne spune ceva greșit! Aceste transformări sunt preluate din undă sinusoidală pură (codul său este în imagine), din dreapta puteți vedea fft, freqz de către maniera explicată sus și (stânga) DTFT așa cum am explicat mai devreme.

Editați după comentariul lui „Jason R”: Ok, am eliminat și scara logaritmică, deoarece mă face să confund. După aceea, intuitiv sunteți la fel, după cum puteți vedea în imaginea următoare, dar de ce nu sunt exact la fel (consultați ultima imagine prin scară logaritmică?)? introduceți descrierea imaginii aici

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

Sine sample:

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) 

Comentarii

  • Ar trebui să postați un script complet care generează graficele pe care le a dat.
  • O diferență este că văd că în codul dvs. trageți DTFT de la -fs / 2 la + fs / 2 în timp ce FFT merge de la 0 la fs în comparație. (Dar puteți utiliza ” fft shitt „) Fără să văd tot codul, bănuiesc că diferența dintre cele două grafice este o eroare de rotunjire care ar fi redusă prin includerea mai multor puncte sau trecerea la flotori de precizie dublă. Rețineți că DTFT va fi o funcție Sinc din care FFT va fi eșantion, cu excepția cazului în care creați o undă sinusoidală cu o frecvență care este un sub multiplu întreg al ratei de eșantionare. Știți, de asemenea, că puteți obține probe de DTFT prin zero-padding FFT.
  • @DanBoschen în cifra fft, 1000 înseamnă fs / 2?
  • Nu 1000 înseamnă fs, forma dvs. de undă este la fs / 2
  • @DanBoschen Puteți explica mai multe de ce ele (DTFT și freqz ale mele, adică) nu sunt exact la fel? Dacă umplu fft-ul, sinc va apărea?

Răspuns

Funcția linspace așa cum este utilizată va fi de la – fs / 2 până la + fs / 2 pentru 3000 de probe, astfel încât + fs / 2 se contorizează de două ori. În schimb, FFT și freqz, care merg de la 0 la N-1, nu dublează cele două puncte finale (în acest caz merg de la DC la 1 coș mai puțin decât fs unde fs este rata de eșantionare). Prin urmare, locațiile eșantionului nu sunt exact aceleași, ducând la diferența observabilă în cele două metode freqz.

În plus, puteți obține mostre ale DTFT prin umplere zero ca o altă opțiune: fft (x, 3000).

În loc de linspace care va funcționa foarte bine dacă alegeți pornirea și oprirea corespunzătoare, îmi place să fac:

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

Comentarii

  • Da pentru a răspunde la a doua întrebare. Cred că abordarea dvs. este corectă. Odată ce remediați locațiile eșantionului, rezultatele ar trebui să se potrivească
  • Că ‘ a funcționat destul de bine, dar a doua mea întrebare a fost: 2) Am confuz, este gama de parametrul t din codul de mai sus, important?
  • Ah, văd — Ei bine, intervalul t este numărul de eșantioane. Ați suprascris 512 eșantioane implicite în frecvență la 3000, de exemplu, ceea ce v-a oferit mai multe eșantioane ale aceluiași DTFT. Acestea fiind spuse, intervalul ‘ nu schimbă răspunsul pentru eșantioanele pe care le alegeți, dar vă oferă mai multe eșantioane în rezultatele dvs. De exemplu, chiar și în cazul dvs. în care ați avut două răspunsuri diferite, deoarece mostrele aveau valori t diferite, în ambele cazuri vedeați același DTFT, doar locații ușor diferite pe aceeași curbă (continuă). (DTFT este o funcție continuă a frecvenței).
  • Cred că ați explicat parametrul w, nu t, nu este ‘ asta? t trebuie să înlocuiască indicii de semnal de timp, dar indexul poate conduce separat de t în exponențială.putem folosi diferite t așa cum se utilizează în indexul semnalului nostru, într-o schemă mai bună putem schimba acea gamă înainte de a calcula exponențial, ceea ce ‘ Este ‘ impactul?
  • În formula dvs., t trebuie să aibă aceeași lungime ca x. Dacă creșteți numărul de eșantioane în t, trebuie să aveți mai multe eșantioane în x, ceea ce înseamnă o precizie mai mare a frecvenței în DTFT (modelul Sinc pe care îl vedeți în frecvență va avea valori mai apropiate). Când numărul de eșantioane din x, t și frecvență se potrivește, calculați DFT (deși calea lungă în comparație cu FFT — motiv pentru care un FFT căptușit zero ar fi o abordare mult mai eficientă pentru a calcula eșantioanele din DTFT sau pur și simplu utilizați freqz așa cum ați avut)

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *