2009-08-11 11 views
3

Ich versuche, die "Beats pro Minute" von Echtzeit-Audio in C# zu bestimmen. Es ist nicht die Musik, die ich erkenne, sondern nur ein konstantes Klopfgeräusch. Mein Problem besteht darin, die Zeit zwischen diesen Taps zu bestimmen, so dass ich "Taps pro Minute" bestimmen kann. Ich habe versucht, die WaveIn.cs-Klasse da draußen zu verwenden, aber ich verstehe nicht wirklich, wie das Sampling funktioniert. Ich bekomme nicht eine bestimmte Anzahl von Samples pro Sekunde zur Analyse. Ich glaube, ich weiß wirklich nicht, wie man eine genaue Anzahl von Samples pro Sekunde einliest, um die Zeit zwischen Samples zu kennen.Timing in C# Echtzeit-Audioanalyse

Jede Hilfe, um mich in die richtige Richtung zu bringen, würde sehr geschätzt werden.

Antwort

2

Ich denke, Sie könnten Proben mit "Taps" verwirren.

Ein Sample ist eine Zahl, die die Höhe der Schallwelle zu einem bestimmten Zeitpunkt darstellt. Eine typische Wave-Datei kann 44.100 Mal pro Sekunde abgetastet werden. Wenn Sie also zwei Kanäle für Stereo haben, haben Sie 88.200 Sechzehn-Bit-Nummern (Samples) pro Sekunde.

Wenn Sie alle diese Zahlen nehmen und grafisch darstellen ihnen, werden Sie etwas wie diese:

alt text

What you are looking for is this peak ------------^ 

, dass der Hahn.

1

Angenommen, wir sprechen über die gleiche WaveIn.cs, der Konstruktor von WaveLib.WaveInRecorder verwendet ein WaveLib.WaveFormat-Objekt als Parameter. Damit können Sie das Audioformat einstellen, d. Abtastrate, Bittiefe, etc. Scannen Sie einfach die Audio-Samples nach Peaks oder wie auch immer Sie "Taps" erkennen und notieren Sie die durchschnittliche Entfernung in Samples zwischen den Peaks.

Da Sie die Abtastrate des Audiostreams kennen (z. B. 44100 Samples/Sekunde), nehmen Sie die durchschnittliche Peakentfernung (in Samples), multiplizieren Sie sie mit 1/(Samples Rate), um die Zeit (in Sekunden) zu erhalten Taps, dividiere durch 60, um die Zeit (in Minuten) zwischen den Taps zu erhalten, und invertiere, um die Taps/Minute zu erhalten.

Hoffnung, die

hilft
3

Ich bin nicht sicher, welche WaveIn.cs Klasse, die Sie verwenden, aber in der Regel mit Code, der Audio-Aufzeichnungen, Sie entweder A) sagen, der Code die Aufnahme zu starten, und dann zu einem späteren weisen Sie darauf hin, dass der Code beendet wird, und Sie erhalten ein Array (normalerweise vom Typ short []), das die während dieses Zeitraums aufgezeichneten Daten enthält; oder B) weisen Sie den Code an, die Aufzeichnung mit einer bestimmten Puffergröße zu starten, und wenn jeder Puffer gefüllt ist, führt der Code einen Rückruf zu einer Methode aus, die Sie mit einem Verweis auf den gefüllten Puffer definiert haben. Dieser Prozess wird fortgesetzt, bis Sie ihn angeben um die Aufnahme zu stoppen.

Angenommen, Ihr Aufzeichnungsformat beträgt 16 Bit (aka 2 Byte) pro Sample, 44100 Samples pro Sekunde und Mono (1 Kanal). Im Fall von (A) nehmen wir an, dass Sie mit der Aufnahme beginnen und dann genau 10 Sekunden später die Aufnahme stoppen. Sie werden mit einem kurzen Array [] enden, das 441.000 (44.100 x 10) Elemente lang ist. Ich weiß nicht, welchen Algorithmus Sie verwenden, um "Taps" zu erkennen, aber nehmen wir an, dass Sie Taps in diesem Array bei Element 0, Element 22.050, Element 44.100, Element 66.150 usw. erkennen. Dies bedeutet, dass Sie alle Taps finden. 5 Sekunden (weil 22.050 die Hälfte von 44.100 Samples pro Sekunde ist), was bedeutet, dass Sie 2 Taps pro Sekunde und damit 120 BPM haben.

Im Fall von (B) nehmen wir an, dass Sie die Aufnahme mit einer festen Puffergröße von 44.100 Samples beginnen (auch bekannt als 1 Sekunde). Wenn jeder Puffer ankommt, finden Sie Abgriffe bei Element 0 und bei Element 22.050. Mit derselben Logik wie oben berechnen Sie 120 BPM.

Hoffe, das hilft.Bei der Beat-Erkennung im Allgemeinen ist es am besten, für eine relativ lange Zeit aufzunehmen und die Beats durch eine große Datenmenge zu zählen. Der Versuch, das "augenblickliche" Tempo zu schätzen, ist schwieriger und fehleranfällig, genauso wie das Schätzen der Tonhöhe einer Aufnahme in Echtzeit schwieriger ist als das Aufnehmen einer vollen Note.

+0

Also wenn ich mono mache, repräsentiert jede dieser Zahlen in meinem Array ein Sample für einen Kanal? Wenn ich 2 Kanäle tun würde würde mein Array dann 88200 in der Größe? Wechseln zwischen den Kanälen? – zac

+0

Ja, Stereo bedeutet, dass Sie doppelt so viele Samples pro Sekunde haben und die Samples verschachtelt sind (links, rechts, links, rechts usw.), so dass die Elemente 0, 2, 4, 6 usw. Daten für den linken Kanal darstellen Elemente 1, 3, 5, 7 usw. repräsentieren Daten für den rechten Kanal. – MusiGenesis

+0

Eine andere Frage: Wenn ich ein fft hier mache, um die Amplitude zu erhalten, gibt es die halbe Größe meines ursprünglichen Arrays zurück. Aus dem, was ich gelesen habe, ist dies, weil es es in einen Real- und Imaginärteil konvertiert und beide verwendet, um die Amplitude zu erhalten. Wie lauten nun die einzelnen Werte in diesem Array? 2 Proben? – zac