Penso che freqz
in un toolbox MATLAB, sia il modo per ottenere DTFT di sequenza. freqz
può calcolare la risposta in frequenza di:
H (z) = (Num) / (Den)
Possiamo facilmente calcolare la trasformata z di qualsiasi sequenza finita x(n)
come questa:
H (z) = x (0) z ^ 0 + x (1) z ^ 1 + …
Sappiamo nellespressione precedente che Den
, è 1.
Ricordando che: freeqz(num,den,n)
fornisce la risposta al gradino in n punti. Con x essere vettore di x (n),
[x1freqz, x1freqzw]=freqz(x,1,3000,"whole");
deve fornirci il DTFT.
1) È (istruzione sopra) corretta? cosa succede se spostiamo il nostro polinomio ?? perché?
Il secondo modo è calcolare completamente la formula DTFT, in questo modo:
[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) Ho confuso, è lintervallo di parametro t
nel codice precedente, importante?
3) Questa implementazione è corretta? Perché?
Penso che ci debba essere dissonanza, dal momento che limmagine: Dicendoci qualcosa di sbagliato! Queste trasformazioni sono prese dallonda sinusoidale pura (il suo codice nellimmagine), da destra puoi vedere fft
, freqz
dal modo spiegato in alto e (a sinistra) il DTFT come spiegato in precedenza.
Modifica dopo il commento di “Jason R”: Ok, ho anche rimosso la scala logaritmica, poiché mi crea confusione. Dopodiché, intuitivamente le tue sono allo stesso modo, come puoi vedere nellimmagine successiva, ma perché non sono esattamente uguali (fai riferimento allultima immagine in scala logaritmica?)?
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)
Commenti
- Dovresti pubblicare uno script completo che generi i grafici che dato.
- Una differenza è che vedo che nel tuo codice stai tracciando il DTFT da -fs / 2 a + fs / 2 mentre il FFT va da 0 a fs in confronto. (Ma puoi usare " fft shitt ") Senza vedere tutto il tuo codice sospetto che la differenza tra i due grafici sia un errore di arrotondamento che verrebbe ridotto includendo più punti eo andando a virgolette a doppia precisione. Si noti che il DTFT sarà una funzione Sinc di cui lFFT sarà un campione, a meno che non si crei unonda sinusoidale con una frequenza che è un multiplo intero della frequenza di campionamento. Sappi anche che puoi ottenere campioni del DTFT riempiendo a zero la FFT.
- @DanBoschen nella figura fft, 1000 significa fs / 2?
- No 1000 significa fs, la tua forma donda è a fs / 2
- @DanBoschen Puoi spiegare di più perché (il mio DTFT e freqz, intendo) non sono esattamente gli stessi? Se riempio il fft, apparirà sinc?
Answer
La funzione linspace usata va da – fs / 2 a + fs / 2 per 3000 campioni, quindi + fs / 2 viene contato due volte. Al contrario FFT e freqz, che va da 0 a N-1 non duplicano i due punti finali (in questo caso vanno da DC a 1 bin inferiore a fs dove fs è la frequenza di campionamento). Pertanto le posizioni dei campioni non sono esattamente le stesse, il che porta alla differenza osservabile nei due metodi freqz.
Inoltre è possibile ottenere campioni del DTFT da zero padding come unaltra opzione: fft (x, 3000).
Invece di linspace che funzionerà bene se scegli lavvio e larresto corretti, mi piace fare:
t = [0: length (x) -1] * 1 / fs
Commenti
- Sì per rispondere alla tua seconda domanda, credo che il tuo approccio sia corretto. Dopo aver corretto le posizioni di esempio, i risultati dovrebbero corrispondere
- Che ' ha funzionato abbastanza bene, ma la mia seconda domanda era: 2) Ho confuso, è lintervallo di parametro t nel codice sopra, importante?
- Ah capisco — Bene, lintervallo di t è il numero di campioni. Ad esempio, hai sovrascritto i 512 campioni predefiniti in freqz per essere 3000, il che ti ha dato più campioni dello stesso DTFT. Detto questo, lintervallo non ' cambia la risposta per i campioni che scegli, ma ti dà più campioni nei risultati. Ad esempio, anche nel tuo caso in cui avevi due risposte diverse perché i campioni avevano valori t leggermente diversi, in entrambi i casi stavi vedendo lo stesso DTFT, solo posizioni leggermente diverse sulla stessa curva (continua). (Il DTFT è una funzione continua della frequenza).
- Penso che tu abbia spiegato il parametro
w
, nont
, non è '?t
deve sovrascrivere gli indici del segnale orario, ma lindice può guidare separatamente dat
nellesponenziale.possiamo usare diversit
usati nellindice del nostro segnale, in uno schema migliore possiamo spostare tale intervallo prima di calcolare lesponenziale, cosa ' è l ' impatto? - Nella formula t deve avere la stessa lunghezza di x. Se aumenti il numero di campioni in t, devi avere più campioni in x, il che significa una maggiore precisione di frequenza nel tuo DTFT (il modello Sinc che vedi in frequenza avrà valori nulli più vicini tra loro). Quando il numero di campioni in x, te la frequenza corrispondono, stai calcolando la DFT (anche se la strada più lunga rispetto alla FFT — ecco perché una FFT con riempimento zero sarebbe un approccio molto più efficiente per calcolare i campioni del DTFT, o semplicemente usa freqz come hai)