Frage

Der Versuch, eine FFT (Fast Fourier Transformation) Routine Ich verwende (Diebstahl) (Recycling)

verstehen

Eingabe ist ein Array von 512 Datenpunkten, die eine Probe-Wellenform sind. Testdaten werden in diesem Array erzeugt. fft wandelt diese Anordnung in dem Frequenzbereich. Der Versuch Beziehung zwischen FREQ, Periode, die Abtastrate und die Position in fft Array zu verstehen. Ich werde mit Beispielen veranschaulichen:

========================================

Die Abtastrate beträgt 1000 Proben / s. Erzeugen Sie eine Reihe von Proben, die bei 10 Hz.

Eingabe Array hat Spitzenwerte bei arr (28), arr (128), arr (228), ... Zeit = 100 Abtastpunkte

Spitzenwert in fft Array bei Index 6 (ohne einen großen Wert bei 0)

========================================

Die Abtastrate beträgt 8000 Proben / s Generieren Satz von Proben bei 440Hz

Eingangsarray Spitzenwerte umfassen arr (7), arr (25), arr (43), arr (61) ... Zeit = 18 Abtastpunkte

Spitzenwert in fft Array am Index 29 (ohne einen großen Wert bei 0)

========================================

Wie beziehe ich den Index der Spitze in der fft Array Frequenz?

War es hilfreich?

Lösung

Wenn Sie den imaginären Teil zu ignorieren, die Häufigkeitsverteilung linear über Bins:

Frequenz @ i = (Abtastrate / 2) * (i / Nbins).

So für Ihr erstes Beispiel assumming Sie 256 Bins hatten, entspricht die größte ist zu einer Frequenz von 1000/2 * 6/256 = 11,7 Hz. Da Ihr Eingang 10Hz war, würde ich vermuten, dass sind 5 (9,7 Hz) auch eine große Komponente hatte. Um eine bessere Genauigkeit, müssen Sie mehr Proben nehmen, um kleinere Behälter zu bekommen.

Ihr zweites Beispiel gibt 8000/2 * 29/256 = 453Hz. Auch hier, in der Nähe, aber Sie brauchen mehr Bins. Ihre Auflösung ist hier nur 4000/256 = 15,6 Hz.

Andere Tipps

Es wäre hilfreich, wenn Sie Ihren Beispieldatensatz zur Verfügung zu stellen sind.

Meine Vermutung wäre, dass Sie haben, was Sampling-Artefakte bezeichnet werden. Das starke Signal bei DC (Frequenz 0) legt nahe, dass dies der Fall ist.

Sie sollten immer darauf achten, dass der Durchschnittswert in Ihrem Eingangsdaten Null - den Mittelwert finden und subtrahieren sie von jedem Probenpunkt vor der fft ist eine gute Praxis Aufruf

.

In der gleichen Richtung, müssen Sie über das Abtastfenster Artefakt vorsichtig sein. Es ist wichtig, dass der erste und die letzte Datenpunkt nahe bei null liegen, da sonst die „Stufe“ von außen nach innen Abtastfenster die Wirkung der Injektion eine ganze Menge Energie bei unterschiedlichen Frequenzen hat.

Das Endergebnis ist, dass eine FFT-Analyse ist mehr Sorgfalt erfordert als nur eine fft Routine irgendwo gefunden Recycling.

Hier werden die ersten 100 Abtastpunkte eines 10 Hz-Signal wie in der Frage beschrieben, massiert Sampling-Artefakte zu vermeiden

> sinx[1:100]
  [1]  0.000000e+00  6.279052e-02  1.253332e-01  1.873813e-01  2.486899e-01  3.090170e-01  3.681246e-01  4.257793e-01  4.817537e-01  5.358268e-01
 [11]  5.877853e-01  6.374240e-01  6.845471e-01  7.289686e-01  7.705132e-01  8.090170e-01  8.443279e-01  8.763067e-01  9.048271e-01  9.297765e-01
 [21]  9.510565e-01  9.685832e-01  9.822873e-01  9.921147e-01  9.980267e-01  1.000000e+00  9.980267e-01  9.921147e-01  9.822873e-01  9.685832e-01
 [31]  9.510565e-01  9.297765e-01  9.048271e-01  8.763067e-01  8.443279e-01  8.090170e-01  7.705132e-01  7.289686e-01  6.845471e-01  6.374240e-01
 [41]  5.877853e-01  5.358268e-01  4.817537e-01  4.257793e-01  3.681246e-01  3.090170e-01  2.486899e-01  1.873813e-01  1.253332e-01  6.279052e-02
 [51] -2.542075e-15 -6.279052e-02 -1.253332e-01 -1.873813e-01 -2.486899e-01 -3.090170e-01 -3.681246e-01 -4.257793e-01 -4.817537e-01 -5.358268e-01
 [61] -5.877853e-01 -6.374240e-01 -6.845471e-01 -7.289686e-01 -7.705132e-01 -8.090170e-01 -8.443279e-01 -8.763067e-01 -9.048271e-01 -9.297765e-01
 [71] -9.510565e-01 -9.685832e-01 -9.822873e-01 -9.921147e-01 -9.980267e-01 -1.000000e+00 -9.980267e-01 -9.921147e-01 -9.822873e-01 -9.685832e-01
 [81] -9.510565e-01 -9.297765e-01 -9.048271e-01 -8.763067e-01 -8.443279e-01 -8.090170e-01 -7.705132e-01 -7.289686e-01 -6.845471e-01 -6.374240e-01
 [91] -5.877853e-01 -5.358268e-01 -4.817537e-01 -4.257793e-01 -3.681246e-01 -3.090170e-01 -2.486899e-01 -1.873813e-01 -1.253332e-01 -6.279052e-02

Und hier sind die daraus resultierenden absoluten Werte des fft Frequenzbereiches

 [1] 7.160038e-13 1.008741e-01 2.080408e-01 3.291725e-01 4.753899e-01 6.653660e-01 9.352601e-01 1.368212e+00 2.211653e+00 4.691243e+00 5.001674e+02
[12] 5.293086e+00 2.742218e+00 1.891330e+00 1.462830e+00 1.203175e+00 1.028079e+00 9.014559e-01 8.052577e-01 7.294489e-01

Ich bin ein wenig rostig auch auf Mathematik und Signalverarbeitung, aber mit den zusätzlichen Informationen, die ich ihm einen Schuss geben kann.

Wenn Sie die Signalenergie pro Fach wissen wollen, müssen Sie die Größe des komplexen Ausgangs. Also einfach auf dem realen Ausgang sucht, ist nicht genug. Selbst wenn die Eingabe nur reelle Zahlen. Für jedes Fach der Größe des Ausgangssignals ist sqrt (real ^ 2 + imag ^ 2), wie Pythagoras: -)

Behälter 0-449 sind positive Frequenzen von 0 Hz bis 500 Hz. bins 500 bis 1000 sind negative Frequenzen und sollte das gleiche wie das positive für ein reales Signal sein. Wenn Sie jede Sekunde Frequenzen und Array-Indizes einen Puffer Prozesslinie auf den Punkt. So ist der Peak bei Index 6 entspricht mit 6 Hz, so dass ein bisschen seltsam. Dies könnte, weil Sie nur an den realen Ausgangsdaten suchen und die realen und imaginären Daten kombinieren, um eine erwartete Peak bei Index 10. Die Frequenzen Karte linear zu den Behältern sollte geben.

Die Peaks bei 0 zeigt einen DC-Offset.

Es ist einige Zeit her, dass ich getan FFT habe aber hier ist, was ich erinnere

FFT dauert in der Regel komplexe Zahlen als Ein- und Ausgang. Also ich bin nicht wirklich sicher, wie die reale und imaginäre Teil der Ein- und Ausgabekarte zu den Arrays.

ich nicht wirklich verstehen, was du tust. Im ersten Beispiel sagen, Sie Abtastpuffern bei 10 Hz für eine Abtastrate von 1000 Hz verarbeiten? Sie sollten also 10 Puffer pro Sekunde mit 100 Proben pro Person. Ich weiß nicht, wie Sie Ihre Eingabe-Array mindestens 228 Proben lang sein kann.

Normalerweise ist die erste Hälfte des Ausgangspuffers ist Frequenz-Bins von 0 Frequenz (= DC-Offset) zu 1/2 Abtastrate. und die zweite Hälfte sind negative Frequenzen. wenn Sie Ihre Eingabe nur reale Daten mit 0 für das imaginäre Signal positive und negative Frequenzen sind gleich ist. Das Verhältnis von realen / imaginären Signal am Ausgang enthält Phaseninformationen aus dem Eingangssignal.

Die Frequenz für das Bin i bin i * (Sample / n), wobei n die Anzahl der Proben in dem Eingangsfenster des FFT ist.

Wenn Sie Audio sind Handhabung, da Tonhöhe proportional der Frequenz zu protokollieren, die Tonhöhe Auflösung der Behälter erhöht, wenn die Frequenz tut - es ist schwer, genau niederfrequente Signale zu lösen. Um dies zu tun benötigen Sie größere FFT-Fenster zu verwenden, die Zeitauflösung reduziert. Es ist ein Kompromiss der Frequenz gegen Zeitauflösung für eine gegebene Abtastrate.

Sie erwähnen einen Behälter mit einem großen Wert bei 0 - das ist der Behälter mit der Frequenz 0, das heißt die DC-Komponente. Wenn diese groß ist, dann vermutlich sind Ihre Werte in der Regel positiv. Bin n / 2 (in Ihrem Fall 256) ist die Nyquist-Frequenz, die halbe Rate Probe, die die höchste Frequenz, die in dem abgetasteten Signal mit dieser Rate aufgelöst werden kann.

Wenn das Signal real ist, dann Bins n / 2 + 1 bis n-1 die komplexe Konjugate von Bins enthält n / 2-1 bis 1 ist. Der DC-Wert erscheint nur einmal.

Die Proben werden, wie bereits gesagt wurde, in gleicher Weise in dem Frequenzbereich beabstandet sind (nicht logarithmisch).

Zum Beispiel 1, sollen Sie diese:

alt text http://home.comcast.net/~kootsoop/images /SINE1.jpg

Für das andere Beispiel sollten Sie

alt text http://home.comcast.net/~kootsoop/images /SINE2.jpg

So Ihre Antworten erscheinen sowohl in Bezug auf die Spitzen Lage, korrekt sein.

Was ich nicht immer ist die große Gleichstromkomponente. Sind Sie sicher, dass Sie eine Sinuswelle als Eingang generieren? Geht der Eingang negativ? Für eine Sinuswelle, sollte der DC sein nahe Null, sofern Sie genügend Zyklen erhalten.

Eine weitere Möglichkeit ist es, eine Goertzel-Algorithmus jeder Note Mittenfrequenz Sie suchen Handwerk .

Wenn Sie eine Implementierung des Algorithmus erhalten arbeiten Sie es so machen kann, dass sie Parameter nimmt einstellen es Mittenfrequenz ist. Damit könnte man leicht 88 von ihnen laufen oder was auch immer Sie brauchen in einer Sammlung und scannen für den Spitzenwert.

Der Goertzel-Algorithmus ist im Grunde ein einziges ist FFT. Mit dieser Methode können Sie Ihre Behälter logarithmisch platzieren können als Noten natürlich gehen.

Einige Pseudo-Code aus Wikipedia:

s_prev = 0
s_prev2 = 0
coeff = 2*cos(2*PI*normalized_frequency);
for each sample, x[n],
  s = x[n] + coeff*s_prev - s_prev2;
  s_prev2 = s_prev;
  s_prev = s;
end
power = s_prev2*s_prev2 + s_prev*s_prev - coeff*s_prev2*s_prev;

Die beiden Variablen, die die letzten beiden Proben darstellen, werden für die nächste Iteration gehalten. Dies kann dann in einer Streaming-Anwendung verwendet werden. Ich denke vielleicht die Leistungsberechnung sollte auch innerhalb der Schleife sein. (Es ist jedoch nicht als solche in der Wiki-Artikel dargestellt.)

In dem Tondetektion Fall 88 würde verschiedene coeficients, 88 Paare von vorhergehenden Proben und in 88 Leistungsausgangsproben, welche die relativen Pegel in diesem Frequenzbehälter führen würde.

WaveyDavey sagt, dass er Ton von einem Mikrofon ist die Erfassung, durch die Audio-Hardware seines Computers, aber seine Ergebnisse sind nicht Null-zentriert. Das klingt wie ein Problem mit der Hardware. Es ist zu Null-zentriert ist.

Wenn das Zimmer ruhig ist, sollte der Strom von Werten aus dem Sound-API kommen sehr nahe 0 Amplitude mit geringen + - Variationen für Umgebungsgeräusche. Wenn ein Vibrations Ton im Raum anwesend ist (zum Beispiel ein Klavier, eine Flöte, eine Stimme) soll der Datenstrom zeigt eine grundsätzlich sinusbasierte Welle, die sowohl positiv als auch negativ, und mittelt nahe Null geht. Ist dies nicht der Fall ist, hat das System einige Funk auf! Gehen

-Rick

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top