我正在努力制作一个实时(ish)单声道吉他到midi节目。我希望延迟<= 6毫秒。为了找到所播放的音符,我的目标是采样256点(应该大约需要6毫米),运行一个fft并分析mag图以确定音符的音高。
当我在matlab中执行此操作时,它会让我返回非常不稳定/不准确的结果,并且在随机位置出现峰值等。
输入的音符是在44.1khz时采样的110Hz。我已经应用了一个500hz的高通滤波器,滚降了48db / octave ..所以只有高次谐波的信号才能保留。音频持续1秒钟(256个样本后填充零)
代码:
%fft work
guitar = wavread('C:\Users\Donnacha\Desktop\Astring110hz.wav');
guitar(1:44100);
X = fft(guitar);
Xmag = abs(X);
plot(Xmag);
我希望看到110Hz(吉他音符)的所有谐波从&gt; 500hz开始。
如何使用这么少的数据从FFT获得准确的结果?
答案 0 :(得分:0)
你不能。 (至少可靠地用于吉他范围内的所有音符)。
44.1kHz的256个样本小于大多数低弦吉他音符的一个周期。根据吉他的调音和语调,来自吉他的低音E弦的一段振动大约需要535个样本。
谐波通常需要在FFT窗口内多次(重复)吉他音符波形,以便可靠地显示在FFT的频谱中。 FFT窗口中的周期越多,谐波在FFT频谱中出现的越可靠和越清晰。如果数据是Von Hann(et.al.)窗口以避免&#34;泄漏&#34;则需要更多的时间段。窗口文物。因此,您必须根据所需的最低音符,窗口类型以及统计可靠性和频率分辨率要求选择所需的最小周期数。
另一种方法是将256个样本的几组连接到一个更长的窗口,至少与您想要可靠绘制的最低音高的几个周期一样长。