Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab中的频率转换_Matlab - Fatal编程技术网

matlab中的频率转换

matlab中的频率转换,matlab,Matlab,所以我创建了一个MATLAB程序来检测钢琴录音中的频率。现在我需要将这些检测到的频率转换成相应的钢琴音符 我知道有一种理论是关于使用A4(440Hz)作为参考音符,并以此为基础推导出其余的音符。但是我正在寻找一个类似查找表的东西,在那里我可以通过查找表直接调用相应的钢琴音符。我不太确定如何继续下去,所以我想就我能做些什么提出一些建议。。。Thanx从(只是第一次谷歌点击,没什么特别的),你可以看到,所有音调的频率都是通过 f = f0 · 2^(i/12) >代码> f0=a4=440 <

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

我知道有一种理论是关于使用A4(440Hz)作为参考音符,并以此为基础推导出其余的音符。但是我正在寻找一个类似查找表的东西,在那里我可以通过查找表直接调用相应的钢琴音符。我不太确定如何继续下去,所以我想就我能做些什么提出一些建议。。。Thanx

从(只是第一次谷歌点击,没什么特别的),你可以看到,所有音调的频率都是通过

f = f0 · 2^(i/12)
<> >代码> f0=a4=440 < /代码> Hz,以及<代码> 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)
%您的频率(可以是任何大小,必须以Hz为单位)
V=[174504000];
%生成查找表
LUT=440*(2^(1/12))。^(-57:42);
%所有这些音符的名字
noteNames={。。。
"安"安♯/BN♭' 'BN''CN''CN♯/DN♭' 'DN“”DN♯/EN♭' 'EN“FN”FN♯/GN♭' 'GN''GN♯/一♭'};
allNotes=[];
对于ii=0:8
allNotes=[allNotes regexprep(noteNames,'N',num2str(ii));end%#ok
allNotes=allNotes(4:end-4);
%索引到查找表中
[~,I]=min(abs(bsxfun(@负,V(:),LUT)),[],2);
%与您的频率相对应的已命名标记
全部附注(I)

您不需要查找表,也不必将自己限制在特定范围内:(Javascript)


Afaik注释是对数刻度,所以找到对数的某个基数。添加一些数字,使用模计算,这样你在[1,7]中得到一个数字,将其转换为[a,G]。完成。可能对数f/440Hz到基数2有效。我想你的第一个公式应该是
f=f0·(2)^(I/12)
,其中
i
是钢琴上的半键数,你必须从中央
A
向右走。确实是我的幸运日:)非常感谢你,做了一些调整以满足我的要求,效果非常好!!:DAlso注意,你只需要在查找表中输入12个值,因为频率加倍会增加一个音符ctave,所以
A4=440 Hz
A5=880 Hz
@bicker这是真的,但是创建整个表格要比在简化的表格中找到频率的倍数容易得多。另外,完整的LUT并没有那么大。是的,这基本上取决于个人偏好。只需突出显示选项。
function getNoteFromFrequency(frequency) {
  var noteOrder = 'G# A A# B C C# D D# E F F# G'.split(" ");
  var n = Math.round(49 + 12 * Math.log(frequency / 440) / Math.log(2));
  var note = noteOrder[n % noteOrder.length];
  var index = Math.ceil((n - 3) / noteOrder.length);

  return note + index;
}