Ich denke, freqz in einer MATLAB-Toolbox ist der Weg, um DTFT zu erhalten der Sequenz. freqz kann den Frequenzgang berechnen von:

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

Wir können die z-Transformation jeder endlichen Sequenz x(n) wie folgt leicht berechnen:

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

Wir wissen im obigen Ausdruck, dass die Den 1 ist.

Wir erinnern uns daran: freeqz(num,den,n) gibt die Sprungantwort in n Punkt an. Wenn x der Vektor von x (n) ist, muss

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

uns die DTFT geben.

1) Ist es (obige Aussage) richtig? Was passiert, wenn wir unser Polynom verschieben? Warum?

Die zweite Möglichkeit besteht darin, die DTFT-Formel vollständig wie folgt zu berechnen:

[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) Ich bin verwirrt, ist der Bereich von Parameter t im obigen Code, wichtig?

3) Ist diese Implementierung korrekt? Warum?

Ich denke, es muss Dissonanzen geben, da das Bild: hier die Bildbeschreibung eingeben Erzählen Sie uns etwas falsch! Diese Transformationen stammen aus einer reinen Sinuswelle (deren Code im Bild zu sehen ist). Von rechts sehen Sie die fft, freqz von der Art und Weise oben erklärt und (links) die DTFT wie zuvor erklärt.

Nach „Jason R“ Kommentar bearbeiten: Ok, auch ich habe die logarithmische Skala entfernt, da es mich verwirrt. Danach sind Sie intuitiv Wie Sie im nächsten Bild sehen können, aber warum sind sie nicht genau gleich (siehe logarithmisches Maßstab siehe letztes Bild?)? geben Sie ein Bildbeschreibung hier

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

Sinusbeispiel:

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) 

Kommentare

  • Sie sollten ein vollständiges Skript veröffentlichen, das die von Ihnen erstellten Diagramme generiert gab.
  • Ein Unterschied ist, dass ich sehe, dass Sie in Ihrem Code die DTFT von -fs / 2 bis + fs / 2 zeichnen, während die FFT im Vergleich von 0 bis fs geht. (Aber Sie können verwenden “ fft shitt „) Ohne Ihren gesamten Code zu sehen, vermute ich, dass der Unterschied zwischen den beiden Plots ein Rundungsfehler ist, der durch das Einbeziehen von mehr Punkten und / oder das Gleiten von Floats mit doppelter Genauigkeit verringert würde. Beachten Sie, dass die DTFT eine Sinusfunktion ist, von der die FFT Abtastwerte sind, es sei denn, Sie erzeugen eine Sinuswelle mit einer Frequenz, die ein ganzzahliges Sub-Vielfaches der Abtastrate ist. Wissen Sie auch, dass Sie Samples der DTFT erhalten können, indem Sie die FFT auf Null setzen.
  • @DanBoschen in der fft-Abbildung bedeutet 1000 fs / 2?
  • Nein 1000 bedeutet fs, Ihre Wellenform ist bei fs / 2
  • @DanBoschen Kannst du mehr erklären, warum sie (meine DTFT und Freqz, meine ich) nicht genau gleich sind? Wenn ich die fft auffülle, wird sinc angezeigt?

Antwort

Die verwendete Linspace-Funktion geht von – fs / 2 bis + fs / 2 für 3000 Samples, sodass + fs / 2 zweimal gezählt wird. Im Gegensatz dazu duplizieren FFT und Freqz, die von 0 auf N-1 gehen, die beiden Endpunkte nicht (in diesem Fall gehen sie von DC auf 1 Bin weniger als fs, wobei fs die Abtastrate ist). Daher sind die Probenpositionen nicht genau gleich, was zu dem Unterschied führt, der bei den beiden Freqz-Methoden beobachtet werden kann.

Außerdem können Sie Proben der DTFT durch Auffüllen mit Nullen als weitere Option erhalten: fft (x, 3000).

Anstelle von Linspace, das bei Auswahl des richtigen Starts und Stopps einwandfrei funktioniert, mache ich Folgendes:

t = [0: Länge (x) -1] * 1 / fs

Kommentare

  • Ja, um Ihre zweite Frage zu beantworten. Ich glaube, Ihr Ansatz ist korrekt. Sobald Sie die Beispielpositionen festgelegt haben, sollten die Ergebnisse mit
  • übereinstimmen. Das ‚ hat ziemlich gut funktioniert, aber meine zweite Frage war: 2) Ich habe verwirrt, ist der Bereich von Parameter t im obigen Code, wichtig?
  • Ah, ich verstehe — Nun, der Bereich von t ist die Anzahl der Proben. Sie haben die Standard-512-Samples in Freqz auf 3000 überschrieben, wodurch Sie mehr Samples derselben DTFT erhalten haben. Der Bereich ‚ ändert jedoch nicht die Antwort für die von Ihnen ausgewählten Stichproben, sondern bietet Ihnen mehr Stichproben in Ihren Ergebnissen. Selbst in Ihrem Fall, in dem Sie zwei unterschiedliche Antworten hatten, weil die Stichproben leicht unterschiedliche t-Werte hatten, sahen Sie in beiden Fällen dieselbe DTFT, nur geringfügig unterschiedliche Positionen auf derselben (kontinuierlichen) Kurve. (Die DTFT ist eine kontinuierliche Funktion der Frequenz.)
  • Ich denke, Sie haben den Parameter w erklärt, nicht t. Ist das nicht ‚? t muss Zeitsignalindizes überschreiben, aber der Index kann im Exponential getrennt von t fahren.Wir können verschiedene t verwenden, wie sie im Index unseres Signals verwendet werden. In einem besseren Schema können wir diesen Bereich verschieben, bevor wir Exponential berechnen, was ‚ s es ‚ s Auswirkung?
  • In Ihrer Formel muss t die gleiche Länge wie x haben. Wenn Sie die Anzahl der Samples in t erhöhen, müssen Sie mehr Samples in x haben, was eine höhere Frequenzgenauigkeit in Ihrer DTFT bedeutet (das Sinc-Muster, das Sie in der Frequenz sehen, hat Nullen, die näher beieinander liegen). Wenn die Anzahl der Abtastwerte in x, t und Frequenz übereinstimmen, berechnen Sie die DFT (obwohl der lange Weg im Vergleich zur FFT —, weshalb eine mit Null gepolsterte FFT ein viel effizienterer Ansatz für die Berechnung von Abtastwerten wäre der DTFT, oder verwenden Sie einfach freqz wie Sie haben)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.