0

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

当我在 matlab 中执行此操作时,它会返回非常不稳定/不准确的结果,峰值出现在随机位置等。

输入的音符是 110Hz @ 44.1khz 采样。我在 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);

放大 FFT 图

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

我如何用这么少的数据从 FFT 中获得准确的结果?

4

1 回答 1

1

你不能。(至少对于吉他范围内的所有音符都是可靠的)。

44.1kHz 的 256 个样本少于最低弦吉他音符的一个周期。吉他开放式低 E 弦的一个振动周期需要大约 535 个样本,具体取决于吉他的调音和语调。

谐波通常需要 FFT 窗口内吉他音符波形的多个周期(重复),以便可靠地显示在 FFT 的频谱中。FFT 窗口内的周期越多,FFT 频谱中出现的谐波就越可靠、越尖锐。如果数据被 Von Hann (et.al.) 加窗以避免“泄漏”加窗伪影,则需要更多的周期。因此,您必须根据所需的最低音符、窗口类型以及统计可靠性和频率分辨率要求来选择所需的最小周期数。

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

于 2017-10-17T20:20:55.360 回答