Frage

Ich muss die Häufigkeit eines Samples ermitteln, das (in vb) als Byte-Array gespeichert ist.Das Beispiel ist eine Sinuswelle mit bekannter Frequenz, also kann ich es überprüfen), aber die Zahlen sind etwas seltsam und meine Mathematikkenntnisse sind schwach.Vollständiger Wertebereich 0-255.99 % der Zahlen liegen im Bereich von 235 bis 245, aber es gibt einige Ausreißer bis hin zu 0 und 1 und bis zu 255 bei den restlichen 1 %.Wie normalisiere ich dies, um Ausreißer zu entfernen (berechne das 235-245-Intervall, da es sich bei verschiedenen Stichproben ändern kann), und wie berechne ich dann Nulldurchgänge, um die Häufigkeit zu ermitteln?Entschuldigung, wenn diese Beschreibung Unsinn ist!

War es hilfreich?

Lösung

Die FFT ist wahrscheinlich die beste Antwort, aber wenn Sie es wirklich durch Ihre Methode tun wollen, versuchen Sie dies:

Um zu normalisieren, zunächst ein Histogramm machen zu zählen, wie viele occurrances jeden Wert von 0 bis 255 Dann wie X Prozent der Werte von jedem Ende mit etwas werfen:

for (i=lower=0;i< N*(X/100); lower++)
  i+=count[lower];
//repeat in other direction for upper

Jetzt mit

normalisieren
A[i] = 255*(A[i]-lower)/(upper-lower)-128

Wegwerfen Ergebnisse außerhalb des -128..127 Bereich.

Jetzt können Sie Nulldurchgänge zählen. Um sicherzustellen, dass Sie durch Lärm nicht täuschen, können Sie den Überblick über die Steigung in den letzten mehrere Punkten zu halten, und nur Kreuzungen zählen, wenn die durchschnittliche Steigung den richtigen Weg geht.

Andere Tipps

Die Standard-Methode, um dieses Problem in Angriff ist ein Block von Daten zu betrachten, hoffentlich mindestens das Doppelte der tatsächlichen Frequenz (mehr Daten zu nehmen ist nicht schlecht, so ist es gut, ein bisschen zu überschätzen), dann nehmen Sie die FFT und vermuten, dass die Frequenz der größten Anzahl in dem resultierenden FFT-Spektrum.

Durch die Art und Weise, sehr ähnliche Probleme gefragt wurden hier vor -. Sie auch für diese Antworten suchen könnten

Verwenden Sie die Fourier-Transformation, ist es viel mehr Lärm als unempfindlich Zählen Nulldurchgänge

Edit: @WaveyDavey

Ich fand eine F # -Bibliothek eine FFT zu tun: Von hier

  

Wie sich herausstellt, ist die beste kostenlose   Implementierung, die ich für F # gefunden habe   Benutzer ist bisher noch die fantastische   FFTW Bibliothek. Ihre Website hat eine   vorkompilierte Windows-DLL. Ich habe geschrieben   minimal-Bindungen, mit denen   gewinde sicheren Zugang zu FFTW von F #,   sowohl mit Guru und einfachen Schnittstellen.   Die Leistung ist ausgezeichnet, 32-bit   Windows XP Pro ist nur bis zu 35%   langsamer als 64-Bit-Linux.

Jetzt bin ich sicher, dass Sie F # lib von VB.net, C # usw. nennen kann, die in ihrer Dokumente sollte

Wenn ich gut aus Ihrer Beschreibung verstanden, was Sie haben, ist ein Signal, das eine Kombination aus einem Sinus plus eine Konstante plus einige zufälligen Pannen. Sag mal, wie

x[n] = A*sin(f*n + phi) + B + N[n]

wobei N [n] ist die "Glitch" Geräusch, das Sie loswerden wollen.

Wenn die Störungen bei einer Stichprobe lang sind, können Sie sie entfernen, um einen Medianfilter verwendet, die als die Glitch Länge größer sein muss. Auf beiden Seiten des Glitches. Glitches der Länge 1, bedeuten Sie mit einem Median von 3 Proben mit einer Länge genug haben.

y[n] = median3(x[n])

Der Median berechnet wird, so: Nehmen Sie die Proben von x Sie filtern möchten (x [n-1], x [n], x [n + 1]), sortieren, und die Ausgabe ist die mittlere.

Nun, da das Rauschsignal entfernt ist, erhalten von dem konstanten Signal befreien. Ich verstehe die Puffer einer begrenzten und bekannter Länge ist, so dass Sie nur den Mittelwert des gesamten Puffer berechnen kann. Subtrahiert es.

Jetzt haben Sie Ihr einziges Sinussignal. Sie können nun die Grundfrequenz berechnen durch Nulldurchgänge zu zählen. Zählen die Menge von Proben über 0, in dem die frühere Probe lag unter 0. Die Zeit ist die Gesamtmenge an Proben des Puffers durch diesen geteilt, und die Frequenz ist die oposite (1 / x) der Periode.

Obwohl ich mich der Mehrheit anschließen würde und sagen würde, dass Sie anscheinend eine FFT-Lösung wollen (der FFT-Algorithmus ist ziemlich schnell), sollten Sie, wenn FFT aus irgendeinem Grund nicht die Antwort ist, vielleicht versuchen, eine Sinuskurve an die Daten anzupassen Anpassprogramm und Ablesen der angepassten Frequenz.

Benutzen Fityk, können Sie die Daten laden und anpassen a*sin(b*x-c) Wo 2*pi/b Die Frequenz erhalten Sie nach der Anpassung.

Fityk kann über eine GUI oder über eine Befehlszeile für die Skripterstellung verwendet werden und verfügt über eine C++-API, sodass es direkt in Ihre Programme eingebunden werden kann.

Ich googeln für "basic fft". Visual Basic FFT Ihre Frage FFT schreit, aber seien Sie vorsichtig, ohne zu verstehen, mit FFT sogar eine wenig über DSP Ergebnissen führen, die Sie nicht verstehen, oder nicht wissen, woher sie kommen.

erhalten die Frequency Analyzer unter http://www.relisoft.com/Freeware/index. htm und es läuft und den Code sehen.

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