2017-10-17 2 views
0

Ich versuche, eine Echtzeit (ish) monophone Gitarre zum Midi-Programm zu machen. Ich möchte eine Latenz von < = 6 Millisekunden. Um herauszufinden, welche Note gespielt wurde, möchte ich 256 Punkte (etwa 6 Millis) abtasten, ein Fft ausführen und den Mag-Plot analysieren, um die Tonhöhe der gespielten Note zu bestimmen. Wie man genaue FFT-Plot von Gitarrenharmonischen mit nur 256 Datenpunkten @ 44.1khz Fs erzeugt [Matlab]

Wenn ich diese Matlab in zu tun, es gibt mir wieder sehr instabil/ungenaue Ergebnisse mit Spitzen in zufälligen Stellen erscheinen, usw.

Die Note eingegeben wird, ist 110Hz abgetastet @ 44,1. Ich habe einen Hochpassfilter bei 500Hz mit einem Roll-off von 48db/Oktave angelegt ... also sollten nur die höheren Harmonischen des Signals bleiben. Die Audio zuletzt für 1 Sekunde (gefüllt mit Nullen nach 256 Proben)

Code:

%fft work 

guitar = wavread('C:\Users\Donnacha\Desktop\Astring110hz.wav'); 
guitar(1:44100); 
X = fft(guitar); 
Xmag = abs(X); 
plot(Xmag); 

Zoomed in FFT plot

Ich hatte gehofft, alle Harmonischen von 110Hz (Ein Hinweis auf der Gitarre), um zu sehen ab > 500hz ..

Wie würde ich genaue Ergebnisse von einer FFT mit so wenig Daten erzielen?

+1

Sie können nichts umsonst bekommen. Die Frequenzauflösung einer "N" -Punkt-FFT mit einer Abtastrate "Fs" ist "Fs/N". Für eine Samplerate von 44,1 kHz und eine 256-Punkte-FFT liegt Ihre Auflösung bei 172 Hz. Sie können versuchen, die Peaks zu interpolieren, um eine bessere Auflösung zu erhalten, aber es wird wahrscheinlich zu ungenau für Ihre Bedürfnisse sein. –

+0

So hat Ihre FFT 128 FFT Bins (einseitig), mit einer Abtastrate von 44,1 kHz haben Sie eine Auflösung von ~ 172Hz pro Bin. Ich bin mir nicht sicher, was Sie erwarten zu sehen? – Irreducible

+1

Siehe [diese ähnliche Frage] (https://Stackoverflow.com/q/41783512/253056) für eine Diskussion über bessere Frequenzschätzungen. –

Antwort

0

Sie können nicht. (zumindest zuverlässig für alle Noten im Bereich einer Gitarre).

256 Samples bei 44,1 kHz sind weniger als eine Periode der meisten tiefen Gitarrensätze. Eine Schwingungsperiode von einer offenen E-Saite einer Gitarre dauert etwa 535 Samples, abhängig von der Stimmung und Intonation der Gitarre.

Obertöne erfordern oft mehrere Perioden (Wiederholungen) einer Gitarrensignal-Wellenform innerhalb des FFT-Fensters, um im FFT-Spektrum zuverlässig zu erscheinen. Je mehr Perioden innerhalb des FFT-Fensters, desto zuverlässiger und schärfer erscheinen die Harmonischen im FFT-Spektrum. Es sind sogar noch mehr Perioden erforderlich, wenn die Daten von Von (Hann. et.al.) gefenstert sind, um "Lecken" von Fensterartefakten zu vermeiden. Sie müssen also die Mindestzahl der benötigten Perioden auswählen, basierend auf der niedrigsten benötigten Note, Ihrem Fenstertyp und Ihren statistischen Zuverlässigkeits- und Frequenzauflösungsanforderungen.

Eine Alternative besteht darin, mehrere Sätze Ihrer 256 Samples in ein längeres Fenster zu verketten, zumindest so lange wie mehrere Perioden der niedrigsten Tonhöhe, die Sie zuverlässig plotten möchten.

+0

Es gibt bessere Methoden der Pitch-Tracking mit niedriger Latenz als mit einer Null gepolsterten FFT. Aber das ist eine separate Frage. – hotpaw2

+0

Wird das nicht einfach zur Latenz beitragen?Ich hatte gehofft, nur die höheren Harmonischen analysieren zu können und somit mehr Datenpunkte zu vermeiden. Das niedrige E auf einer Gitarre ist ca. 82hz/12millis für den vollen zyklus .. aber ich hatte gehofft, dass nur 6 millis von daten (256ische datenpunkte), würde ich zumindest erfassen die höheren harmonien .. ist das denken fehlerhaft? Wäre eine zeitbasierte Methode (vielleicht Kreuzkorrelation) besser geeignet? – flickyducky101

+0

Wissen Sie, was die höheren Harmonischen verursacht oder in einem Spektrum erscheinen lässt? Andere zeitbasierte Methoden sind eine separate Frage, daher werde ich unter der aktuellen FFT-Frage nicht antworten. – hotpaw2

Verwandte Themen