在matlab中将频率转换为Note

use*_*542 2 matlab

所以我创建了一个MATLAB程序来检测钢琴录音中的频率.现在我需要将这些检测到的频率转换为相应的钢琴音符.

我知道有一个关于使用A4(440Hz)作为参考音符的理论,并基于此推导出其余部分.但是我正在寻找像查找表这样的东西,在那里我可以通过查看查找表直接调用相应的钢琴音符.我不太确定如何继续讨论它,所以想要一些关于我能做什么的建议...... Thanx

Rod*_*uis 5

这里(只是第一次Google热门,没什么特别的),您可以看到同等级别中所有音符的所有频率都是通过

f = f0 · 2^(i/12)
Run Code Online (Sandbox Code Playgroud)

带有f0 = A4 = 440Hz,以及i距离基本音符半步的数量.这允许您LUT为所有笔记创建查找表().

你需要做的一件事就是:

  • 找到最接近频率的LUT中的条目
  • 将这些条目映射到命名的笔记
  • 定义源钢琴的范围(是的,范围可以不同).

今天是你的幸运日(我很无聊和拖延:),所以这里是一个相当完整的实现,从C0到E8的笔记♭:

% Your frequencies (can be of any size, must be in Hz)
V = [17 450 4000];


% Generate the lookup table
LUT = 440 * (2^(1/12)).^(-57:42);

% The names of all those notes
noteNames = {...
    'AN' 'AN?/BN?' 'BN' 'CN' 'CN?/DN?' 'DN' 'DN?/EN?' 'EN' 'FN' 'FN?/GN?' 'GN' 'GN?/AN?'};
allNotes = [];
for ii = 0:8
    allNotes = [allNotes regexprep(noteNames, 'N', num2str(ii))]; end %#ok<AGROW>
allNotes = allNotes(4:end-4);

% Indices into the lookup table
[~,I] = min(abs(bsxfun(@minus, V(:), LUT)), [], 2);

% The named noted corresponding to your frequencies
allNotes(I)
Run Code Online (Sandbox Code Playgroud)