Ich weiß, dass FFT eine Funktion in der Zeitdomäne zu einer in der Frequenzdomäne zeigt.
Wenn ich jedoch versuche, den Graphen im Frequenzbereich aufzuzeichnen, kann ich ihn nur richtig arbeiten lassen, indem ich die Zeit als X-Achse verwende, obwohl es offensichtlich nicht so ist, sondern die Frequenz.
>Außerdem kann ich nur die Amplituden erreichen, die mit denen im ursprünglichen Signal übereinstimmen, indem ich die y-Achse durch eine bestimmte ganze Zahl dividiere. Warum ist das so?
Hier ist mein Code
%Vor%und Grafiken.
Bitte helfe = (
Die Häufigkeit der einzelnen von der FFT erzeugten Werte hängt linear mit dem Index des Ausgabewerts zusammen:
%Vor% Wobei N die Anzahl der FFT-Punkte ist (zB N=length(y)
). In Ihrem Fall N=2001
.
Man kann die Abtastfrequenz von deiner Definition von t
als 1 / T abziehen, wobei T das Abtastzeit-Intervall ist (T = 0,001 in deinem Fall).
Also ist die Abtastfrequenz 1000Hz.
Beachten Sie, dass der Wert von t(i)
ebenfalls linear mit dem Index i
über
es ist möglich (obwohl nicht unbedingt empfohlen, da dies nur Ihren Code verdecken würde) f = 1000*t*sampling_frequency/N
zu definieren.
Beachten Sie, dass Sie den Ausdruck sampling_frequency/N
fehlten, der dazu führte, dass Töne mit der falschen Frequenz angezeigt wurden
(Von der Definition von x
sollten Spitzen bei 10 Hz und 50 Hz und die entsprechenden Aliase bei 990 Hz und 950 Hz sein.)
Beachten Sie, dass die beobachtete Beziehung nur approximativ ist, also ist das Folgende kein mathematischer Beweis, sondern lediglich eine intuitive Möglichkeit, die Beziehung zwischen den Zeitbereichtonamplituden und den Frequenzbereichsspitzenwerten zu visualisieren. em>
Vereinfacht das Problem mit einem einzigen Ton:
%Vor%Die ungefähre Amplitude des entsprechenden Peaks könnte mit Parsevs Theorem abgeleitet werden:
Im Zeitbereich (der linken Seite der Gleichung) ist der Ausdruck ungefähr gleich 0.5*N*(A^2)
.
Nehmen Sie im Frequenzbereich (die rechte Seite der Gleichung) folgende Annahmen vor:
f
und der entsprechenden Alias-Frequenz sampling_frequency-f
), die für die Summierung verantwortlich sind (alle anderen Bins sind ~ 0). Beachten Sie, dass dies normalerweise nur gilt, wenn die Tonfrequenz ein exaktes (oder nahezu exaktes) Vielfaches von sampling_frequency/N
ist. Der Ausdruck auf der rechten Seite ist ungefähr gleich 2*(1/N)*abs(X(k))^2
für einen Wert von k
, der dem Peak bei der Häufigkeit f
entspricht.
Die beiden zusammen ergeben abs(X(k)) ~ 0.5*A*N
. Mit anderen Worten, die Ausgangsamplitude zeigt einen Skalierungsfaktor von 0.5*N
(oder ungefähr 1000 in Ihrem Fall) in Bezug auf die Zeitdomänenamplitude, wie Sie beobachtet haben.
Die Idee gilt immer noch mit mehr als einem Ton (obwohl die vernachlässigbare spektrale Streuverlustannahme schließlich zusammenbricht).
Sie können fftshift verwenden, um die Nullfrequenz zu zentrieren, aber das ist nicht so wichtig.
Nach dem Nyquist / Kotelnikov-Theorem ist die höchste Frequenz die Hälfte der Abtastrate: fmax = fsample / 2. Da Sie eine Abtastrate von 1 kHz haben, erhalten Sie höchstens 500 Hz. Der Frequenzschritt ist die Umkehrung der Erfassungszeit: df = 1/2 = 0,5 Hz in Ihrem Fall.
Also ist die Formel in der anderen Antwort falsch, Sie müssen sie halbieren.
Jetzt haben Sie 1000 in der Mitte des Diagramms. Sie werden nur die erste Hälfte davon verwenden. Für jeden Punkt die Hälfte der Zahl auf der X-Achse, um die Frequenz zu erhalten.
PS.Ich konnte mich nicht äußern, weil ich nicht genug Reputation habe.
Tags und Links plot fft signal-processing octave