2

我正在编写一个程序来帮助人们学习吉他。为此,我需要能够查看时间样本并查看他们演奏的音符。我查看了 FFTW,但我不明白如何让它工作。我也试图弄清楚 Goertzel 算法,但它似乎只适用于像拨号音这样的单频音符(虽然不确定)。需要明确的是,我确实需要能够检测多个音符(以查看是否演奏了一个和弦),但如果有一些谐波也进入那里也没关系。

我正在用 C++ 编写代码,并且更喜欢跨平台的解决方案。

更新:我意识到检测特定音符并不重要;我真正需要的是检查某些频率是否存在,而其他频率不存在。例如,如果有人演奏 C,我想检查是否存在 C 频率(大约 262 Hz),以及可能是 524 Hz 和 786 Hz,并检查附近的音符是否不在泛音系列中(如B 和 D) 不存在。

4

3 回答 3

3

注释不存在于 wav 文件中。采样的声音是。

人类可能会感知到一些音符,这些音符可能已被播放以在某些 wav 文件中创建声音,但是从录制的声音到转录音乐的自动复音音高估计/识别,以获得丰富和复杂的波形,例如由吉他产生的波形,似乎仍然是一种高级研究课题。

对于某些非常受限制的音乐声音类型,如果可能,将涉及一些重要的 DSP。FFTW 可能对音高估计所需的更复杂的 DSP 处理的一小部分有用,而 Goertzel 滤波则不那么有用。

于 2012-07-09T01:51:37.530 回答
0

我无法向您指出具体细节,但我相信您需要的是傅立叶变换来检测您正在寻找的频率。这里也有类似的问题

于 2012-07-09T18:20:52.747 回答
0

这个pdf怎么样? http://miracle.otago.ac.nz/tartini/papers/A_Smarter_Way_to_Find_Pitch.pdf

FFT 的问题在于,如果您执行 256 个样本 FFT,您将仅获得 256 个输出。从本质上讲,这意味着它将您的频率空间(其中有无限数量的频率)划分为一组有限的频率。

This is because if you only check 256 samples (256 can be replace by N, the number of samples used for the FFT), any frequency which is related by a multiple of 256 will look the same.

In other words, if you check 256 evenly spaced samples, taken at time 0, 1/256, 2/256, 3/256, ... 255/256. Then, the two signals sin(2 pi 80 x), which has frequency 80 cycles/sec, and sin(2 pi (80 + 9*256) x), which has frequency (80+9*256), will have the same samples.

Here, 9 can be replaced by k, the multiple to use. You could replace 9 with 1,2,3,4,5, etc. You can replace 256 (N) with any value as well.

As an example, sampling both at 200/256, one of the samples, we have: sin(2 pi (80 + 9*256) (200/256)) = sin(2 pi 80 (200/256) + 2 pi * 9 * 200)

Because multiples of 2 pi don't affect sin, this is the same as sin(2 pi 80 (200/256)).

More generically, sin(2 pi (M + k*N) j/N) = sin (2 pi M (j/N) + 2 pi k*j) = sin (2 pi M (j/N) ), where j is any integer 0,..., N - 1, N is the number of samples, (j/N) is the time to sample, M is the number of cycles per second, k is any integer ... -2, -1, 0, 1, 2 ...

From Nyquist sampling, if you want to distinguish, -128, -127, -126, -125, ..., 125, 126, 127 cycles per second you would take 256 samples/sec. 256 samples/sec means distinguishing 256 frequencies. However, 0 cycles/sec, 256 cycles/sec, 512 cycles/sec, 1024 cycles/sec would all look the same.

于 2014-04-28T04:02:32.337 回答