音高和持续时间和采样率 fs 其中“pitch”是半音中音符音高的向量(0表示静音),“持续时间”是音符持续时间的向量,以秒为单位,“fs”是用于播放的输出波信号的采样率。
pitch= [55 55 55 55 57 55 0 57 60 0 ];
duration=[23 23 23 23 23 35 9 23 69 18 ]/64;
fs=16000;
我想使用上面的信息在MATLAB中返回音频信号。 有人可以教我吗?
THX
答案 0 :(得分:1)
这需要一些思考,可能只需要花一些时间在一切正常之前写下来。
就个人而言,我将任务分解为多个功能,在我看来会涉及到:
1. Semitone to frequency
2. Time to sample number
3. Frequency and sample number to output waveform
如果可能的话,你应该添加另一个数组,其中涉及级别以便稍后进一步进展/帮助将问题简化为阶段。
由于我不确定你使用的是哪个半音缩放,你必须自己确认这个,但是你需要某种类似转换器/查找表(根据Physics of Music website的公式):
function [frequency] = semitone2frequency(semitone)
%Your input is how many semitones ABOVE middle C your note is
frequency = 440*((2^(1/12))^semitone); % where 440 Hz is middle C
end
这是基于相同的钢化量表。现在你知道了你可以产生声音的音符的频率,但等等了......
现在,您可以通过编写另一个函数来计算样本中每个声音的时间......
function [nSamples] = time2samples(time, Fs)
dt = 1/Fs;
nSamples = time*dt;
end
现在您已拥有这两个值,您可以生成音频信号!
frequency = semitone2frequency(55); %55 semitones above middle C
nSamples = time2samples(2,16000); %How many samples does it need to play 2 seconds
%Generate time array from 0 to how long you want the sound to be
time = 0:1:nSamples; %Starts at 0 increases by 1 sample each time up until 2 seconds worth of samples
%Create your output waveform!
outputAudio = sin(2*pi*frequency.*time);
这将创建一个你可以播放的数组,它会发出一个音符55个半音大于中音C(不确定实际上是什么音符)2秒钟。通过使用:
收听sound(outputAudio, 16000);
你可以在此基础上一个接一个地创建多个声音(我建议创建一个主函数,让你传递所有数组并输出一个音频波形),但这应该足以在给定的持续时间内创建某些半音!
P.S。要在任何时候将级别设为0,只需将 outputAudio 变量乘以0
即可outputAudio = outputAudio.*0; %The . in .* is important!
或进一步控制将其乘以0到1之间的任何等级,以完成音量控制。
我希望这就足够了!祝你好运。