Ich versuche, eine Sinuswelle abzutasten und ihre Frequenzkomponenten zu zeichnen, habe jedoch Probleme bei der Implementierung Das Ergebnis der Entnahme von 65536 Abtastwerten eines Zyklus einer Sinuswelle mit maximaler Amplitude 1 und einer Frequenz 100 ist unten zu sehen. Wo die Y-Achse dies ist, ist die Größe der komplexen Fouriersumme, und die x-Achse ist die Abtastzahl Wie kann ich sehen, welche Frequenz die Sinuswelle von diesem Diagramm hat? Ich möchte ein Diagramm von Frequenz gegen Größe und nicht von Stichprobenanzahl gegen Größe.
Ich hatte eine große Spitze von Amplitude 1 erwartet oder 2 Spitzen mit einer Amplitude von jeweils 0,5, aber ich scheine eine große Amplitude zu bekommen, ich weiß nicht, was ich falsch machen könnte.
Matlab-Code:
Amp = 1; freq = 100; dt = 2 * pi /65536; index = 1; for t = 0:dt:2*pi sine(index) = Amp * sin(2*pi*freq*t); sampleNumber(index) = index; index = index + 1; end transform = fft(sine); magTransform = abs(transform); plot(sampleNumber,magTransform);
Kommentare
- FFT-Implementierungen weisen häufig einen Gewinn auf, der proportional zu $ N $ oder $ \ sqrt {N} $ ist. Ihr Ergebnis ist nicht ' nicht unangemessen.
- Wenn Sie die Größe durch $ N $ teilen, erhalten Sie zwei Spitzen mit Größen von jeweils etwa 0,425 (was immer noch niedriger als die erwarteten 0,5 ist) ) .Wie ändere ich die x-Achse von der Probennummer auf Frequenz?
Antwort
Es sieht so aus als würden Sie Ihre Frequenz in Hertz mit im Bogenmaß / Sek. verwechseln, da Sie in beiden Abtastperioden dt den Faktor $ 2 \ pi $ haben em> und Ihr Signal. Ich habe einen Teil Ihres Codes neu geschrieben, um zu verdeutlichen, was Sie wirklich wollen.
Amp = 1; freqHz = 12000; fsHz = 65536; dt = 1/fsHz; t = 0:dt:1-dt; sine = Amp * sin(2*pi*freqHz*t); N = 65536; transform = fft(sine,N)/N; magTransform = abs(transform); faxis = linspace(-fsHz/2,fsHz/2,N); plot(faxis/1000,fftshift(magTransform)); axis([-40 40 0 0.6]) xlabel("Frequency (KHz)")
Wenn Ihre Abtastfrequenz 65536 Abtastungen / Sekunde beträgt Wenn Sie beispielsweise einen Ton mit 12 kHz wünschen, können Sie ihn wie gezeigt erstellen. Hier beträgt Ihre Abtastperiode also 1/65536 Sekunden.
Ihre Erwartung, zwei Spitzen mit einer Amplitude von jeweils 0,5 zu erhalten, war Richtig – nur Ihr generierter Ton war nicht.
Um die x-Achse auf Hertz zu skalieren, erstellen Sie einfach einen Vektor mit der gleichen Anzahl von Punkten wie Ihr FFT-Ergebnis und mit einem linearen Inkrement von $ – fs / 2 $ bis $ + fs / 2 $ . Beachten Sie auch die fftshift, die ich im Plot verwendet habe. Das liegt daran, dass die Ausgabe der FFT-Funktion von Matlab linear von 0 nach fs geht. Ich finde es einfacher, mir vorzustellen, dass DC zentriert ist, aber so oder so ist es in Ordnung. Ohne die fftshift würde der faxis -Vektor von 0 nach fs gehen.
Antwort
Einige FFTs erfordern eine Division durch 1 / N, um die Größe „natürlich“ darzustellen (was nicht energiesparend ist ). Um die X-Achse zu beschriften, muss die Abtastrate (Fs) bekannt sein. Wenn bekannt, dann ist f_x = bin_index * Fs / N bis zu N / 2 und wird dann für negative Frequenzen gespiegelt. Wenn die Frequenz eines Spektralpeaks (Ihre Eingangs-Sinuswelle) nicht „t genau periodisch in der FFT-Länge ist (z. B. eine Ganzzahl von Zyklen), dann ist die Größe des nächstgelegenen FFT-Ergebnisbereichs kleiner, und Sie müssen zwischen den Behältern interpolieren, um eine genauere Schätzung der Spitzengröße zu finden (parabolische oder fenstergesteuerte Sinc-Kernel-Interpolationen sind häufig).
Antwort
So fügen Sie der Antwort von hotpaw2 einige Formeln hinzu:
Mit der FFT berechnen Sie eine Darstellung Ihres Signals als
$$ x (t) = \ sum_ {k = 0} ^ {N-1} \ hat x_k e ^ {2 \ pi i \, f_k \, t} $$
wobei $ f_k = \ frac {k} {N} f_s $ für $ k = 0,1, …, N / 2-1 $ und $ f_k = \ frac {kN} {N} f_s $ für $ k = N / 2, …, N-1 $ unter der Annahme von $ N $ gerade.
Nun erfordert die FFT, dass die Abtastwerte mit dem Abtastschritt $ \ tau = 1 / f_s $ entnommen werden , $ x_n = x (n \ tau) $ und die FFT des Abtastarrays $ (x_n) _n $ ergibt das skalierte Amplitudenarray $ (N \ hat x_k) _k $, da $ \ sum_ {k = 0} ^ {N-1} 1 = N $. Die Neuskalierung i s wird normalerweise aus den FFT-Implementierungen herausgelassen, die vom Benutzer der FFT-Bibliothek behandelt werden sollen.
Antwort
FFT bietet eine Methode von DFT berechnen Sie dies bereits. Betrachten Sie nun ein Signal x (n) und seine DFT X (k). Wenn Ihr Signal aus N Abtastwerten (in Ihrem Fall 65536) besteht, liefert X (k) Werte bei diskreten Frequenzen von 2*pi*k/N
. Tatsächlich bedeutet die obige DFT X (k) X(2*pi*k/N)
. Wenn Sie also X (1) finden, bedeutet dies, dass Sie den DFT-Koeffizienten bei einer diskreten Frequenz von 2 * pi * 1 / N und ähnlich finden. X (2) bedeutet Koeffizient für 2 * pi * 2 / N und damit weiter. Jeder Koeffizient zeigt den Beitrag dieser Frequenz in diesem Signal, wenn er groß ist, bedeutet dies, dass die Frequenz einen Hauptteil des Signals ausmacht. Um fft in Bezug auf die Frequenz zu zeichnen, ersetzen Sie die Abtastachse durch eine Frequenzachse mit Punkten 2*pi*k/N
, wobei k = 0 bis 65535.FT liefert niemals Informationen bezüglich der Zeit. Es werden nur Frequenzinformationen der bereitgestellt Signal.