1

我是 MATLAB 新手,正在开发一个基于麦克风输入处理人声频率的程序。我遇到的最大问题是音符(我在这个项目中处理的)频率呈指数增长,音阶中每个半音大约为 1.059463^x。
在我正在处理的程序中,我需要缩放图表以使检测到的频率接近它对应的音符编号,并缩放数据以便我可以根据音符和音分来处理音符编号因此频率图可以很容易地转换为 MIDI 数据。
我发现的唯一其他选择是为记录的频率创建一个频率库以进行比较,但这不必要地复杂且耗时。
所以,从本质上讲,我正在尝试缩放数据,以便频率为 110Hz 的 A2 对应于它的音符编号 45。有没有办法做到这一点?

4

1 回答 1

0

我认为这可以满足您的要求:

f = 110; %// frequency in Hz
n = log10(f/440)/log10(2)*12+69; %// 440 Hz (note A4) is note 69
note = round(n);
cents = round((n-note)*100);

例子:f = 110

note =
    45
cents =
     0

f = 345

note =
    65
cents =
   -21

按照这个参考这个转换器

于 2015-04-01T12:28:58.243 回答