我是MATLAB的新手,正在开发一个基于麦克风输入处理人声频率的程序。我遇到的最大问题是音符(我在这个项目中处理的内容)频率呈指数级增加,音阶中每个半音音调大约为1.059463 ^ x。
在我正在处理的程序中,我需要对图表进行缩放,以便检测到的频率接近它对应的音符编号以及缩放数据,以便我可以使用音符和音符来处理音符编号。因此频率图可以轻松转换为MIDI数据。
我发现的唯一另一个选择是为要比较的记录频率创建一个频率库,但这是不必要的复杂和耗时。
所以,从本质上讲,我试图缩放数据,以便频率为110Hz的A2对应于它的音符编号45.有没有办法做到这一点?
答案 0 :(得分: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