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);
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?
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. –
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
Siehe [diese ähnliche Frage] (https://Stackoverflow.com/q/41783512/253056) für eine Diskussion über bessere Frequenzschätzungen. –