MATLAB 半对数缩放

MATLAB semilog scaling

我是 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

按照this reference and this converter.