gpt4 book ai didi

matlab - 在 matlab 中将频率转换为音符

转载 作者:行者123 更新时间:2023-12-02 21:43:59 24 4
gpt4 key购买 nike

因此,我创建了一个 MATLAB 程序来检测钢琴录音中存在的频率。现在我需要将这些检测到的频率转换为其相应的钢琴音符。

我知道有一个关于使用 A4 (440Hz) 作为引用音符并基于此推导出其余音符的理论。但我正在寻找类似查找表的东西,我可以通过查看查找表直接调用相应的钢琴音符。我不太确定如何继续下去,所以希望得到一些关于我能做什么的建议......谢谢

最佳答案

来自here (只是第一个谷歌点击,没什么特别的),你可以看到平均律音阶中所有音符的所有频率都通过以下方式相关联

f = f0 · 2^(i/12)

其中 f0 = A4 = 440Hz,i 是距基音的半步数。这允许您为所有音符创建一个查找表 (LUT)。

您唯一需要做的就是:

  • 在 LUT 中查找最接近您的频率的条目
  • 将这些条目映射到命名笔记
  • 定义源钢琴的音域(是的,ranges can differ)。

今天是你的幸运日(我很无聊并且拖延:),所以这里有一个相当完整的实现,用于从 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)

关于matlab - 在 matlab 中将频率转换为音符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19900896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com