我是MATLAB的新手,正在开发一个基于麦克风输入处理人声频率的程序。我遇到的最大问题是音符(我在这个项目中处理的)频率呈指数级增长,音阶中每个半音的频率约为1.059463^x
在我正在处理的程序中,我需要缩放图形,使检测到的频率接近它所对应的音符编号,还需要缩放数据,使我可以根据音符和音乐分来处理音符编号,使频率图形可以很容易地转换为MIDI数据
我发现的唯一其他选择是创建一个频率库,用于与记录的频率进行比较,但这不必要地复杂和耗时
因此,本质上,我试图缩放数据,使频率为110Hz的A2对应于其音符编号45。有办法做到这一点吗?
我认为这符合您的要求:
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
根据该参考文献和该转换器。