如何仅用 256 个数据点 @ 44.1khz Fs 生成准确的吉他谐波 FFT 图?[Matlab]

How to generate accurate FFT plot of guitar harmonics with only 256 data points @ 44.1khz Fs ?[Matlab]

我正在尝试制作一个实时(大概)单音吉他到 midi 程序。我想要 <=6 毫秒的延迟。为了找到演奏的音符,我的目标是采样 256 个点(大约需要 6 毫秒),运行 一个 fft 并分析 mag 图以确定演奏的音符的音高。

当我在 matlab 中执行此操作时,它返回非常 unstable/inaccurate 结果,峰值出现在随机位置等。

正在输入的音符在 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);

Zoomed in FFT plot

我希望看到从 >500hz 开始的 110Hz(吉他音符)的所有谐波..

我如何使用如此少的数据从 FFT 获得准确的结果?

你不能。 (至少对于吉他音域中的所有音符来说是可靠的)。

44.1kHz 的 256 个样本少于大多数低音弦吉他音符的一个周期。根据吉他的调音和音调,吉他的低 E 开弦弦的一个振动周期需要大约 535 个样本。

谐波通常需要 FFT window 中吉他音符波形的多个周期(重复),以便可靠地显示在 FFT 的频谱中。 FFT window 中的周期越多,谐波在 FFT 频谱中显示的越可靠和尖锐。如果数据是 Von Hann (et.al.) windowed 以避免 "leakage" windowing 伪影,则需要更多周期。因此,您必须根据所需的最低音符、您的 window 类型以及您的统计可靠性和频率分辨率要求来选择所需的最少周期数。

另一种方法是将 256 个样本中的几组连接成更长的 window,至少与您想要可靠绘制的最低音高的几个周期一样长。