Jag tror att freqz
i en MATLAB-verktygslåda är sättet att få DTFT sekvens. freqz
kan beräkna frekvenssvaret på:
H (z) = (Num) / (Den)
Vi kan enkelt beräkna z-transformen av alla ändliga sekvenser x(n)
så här:
H (z) = x (0) z ^ 0 + x (1) z ^ 1 + …
Vi vet i ovanstående uttryck att Den
är 1.
Påminner om att: freeqz(num,den,n)
ger stegsvaret i punkt n. Genom x vara vektorn för x (n),
[x1freqz, x1freqzw]=freqz(x,1,3000,"whole");
måste ge oss DTFT.
1) Är det (ovanstående uttalande) korrekt? vad händer om vi flyttar vårt polynom ?? varför?
Det andra sättet är att beräkna DTFT-formeln helt, så här:
[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) Jag förvirrade, är intervallet för parameter t
i ovanstående kod, viktigt?
3) Är denna implementering korrekt? Varför?
Jag tror att det måste finnas dissonans, eftersom bilden: Berätta något fel! Dessa transformationer tas från ren sinusvåg (dess kod på bilden), från höger kan du se fft
, freqz
av sätt förklarade överst och (till vänster) DTFT som förklarats tidigare.
Redigera efter ”Jason R” ”s kommentar: Ok, jag tog också bort logaritmisk skala, eftersom det får mig att förvirra. Därefter är du intuitivt som du kan se i nästa bild, men varför är de inte exakt desamma (hänvisa till sista bilden med logaritmisk skala?)?
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")
Sinexempel:
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)
Kommentarer
- Du bör lägga upp ett fullständigt skript som genererar de tomter som du gav.
- En skillnad är att jag ser att i din kod plottar du DTFT från -fs / 2 till + fs / 2 medan FFT går från 0 till fs i jämförelse. (Men du kan använda " fft shitt ") Utan att se all din kod, misstänker jag att skillnaden i de två ritningarna är avrundningsfel som skulle minskas genom att inkludera fler poäng och eller gå till dubbla precisionsfloat. Observera att DTFT kommer att vara en Sink-funktion som FFT kommer att sampla med, såvida du inte skapar en sinusvåg med en frekvens som är ett heltal delmultipel av samplingshastigheten. Vet också att du kan få prover av DTFT genom att nollstoppa FFT.
- @DanBoschen i fft-figur, 1000 betyder fs / 2?
- Nej 1000 betyder fs, din vågform är vid fs / 2
- @DanBoschen Kan du förklara mer varför de (min DTFT och freqz, jag menar) inte är exakt samma? Om jag fyller på fft visas sinc?
Svar
Linspace-funktionen som den används går från – fs / 2 till + fs / 2 för 3000 prover så att + fs / 2 räknas två gånger. Däremot duplicerar inte FFT och freqz, som går från 0 till N-1, de två slutpunkterna (i det här fallet går de från DC till 1 bin mindre än fs där fs är samplingsfrekvensen). Därför är provplatserna inte exakt samma vilket leder till skillnaden som kan observeras i de två freqz-metoderna.
Vidare kan du få prover av DTFT genom nollpolstring som ett annat alternativ: fft (x, 3000).
Istället för linspace som fungerar bra om du väljer rätt start och stopp, vill jag göra:
t = [0: längd (x) -1] * 1 / fs
Kommentarer
- Ja för att svara på din andra fråga Jag tror att din inställning är korrekt. När du har fixat provplatserna ska resultaten matcha
- Att ' fungerade ganska bra, men min andra fråga var: 2) Jag förvirrade, är intervallet parameter t i ovanstående kod, viktigt?
- Ah jag förstår — Tja, intervallet t är antalet prover. Du överskrider standard 512-samplen i freqz till att vara 3000 till exempel, vilket gav dig fler prover av samma DTFT. Med detta sagt ändrar intervallet inte ' t svaret för de prover du väljer, men ger dig fler prover i dina resultat. Till exempel, även i ditt fall där du hade två olika svar eftersom proverna hade något olika t-värden, såg du i båda fallen samma DTFT, bara lite olika platser på samma (kontinuerliga) kurva. (DTFT är en kontinuerlig funktion av frekvensen).
- Jag tror att du förklarade
w
-parametern, intet
, är det inte '?t
måste åsidosätta tidssignalindex, men index kan köra separat frånt
i exponentialen.vi kan använda olikat
som används i indexet för vår signal, i bättre schema kan vi flytta det intervallet innan vi beräknar exponentiellt, vad ' s it ' s påverkan? - I din formel måste t ha samma längd som x. Om du ökar antalet sampel i t måste du ha fler sampel i x vilket betyder mer frekvensprecision i din DTFT (Sinkmönstret som du ser i frekvensen kommer att ha nollor närmare varandra). När antalet prover i x, t och frekvens matchar, beräknar du DFT (även om den långa vägen jämfört med FFT — varför en nollpolstrad FFT skulle vara en mycket effektivare metod för dig att beräkna prover av DTFT, eller använd bara freqz som du har)