fs=8000;f=[261.63 293.66 329.63 261.63 261.63 293.66 329.63 261.63 329.63 349.23 392 329.63 349.63 392];time=fs*[0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,1];N=length(time);east=zeros(1,N);n=1;for num=1:N t=1/fs:1/fs:time(num)/fs; east(n:n+time(num)-1)=sin(2*pi*f(num)*t); n=n+time(num);endsound(east,8000);audiowrite('two_tigers.wav',east,fs);仿照此段代码形式,利用MATLAB实现儿歌《一只哈巴狗》的音乐合成采样频率设为8000Hz,并利用sound函数进行音乐播放,针对不同乐音之间相位不连续造成的噪声,采用加包络方法进行噪声的消除,对比噪声去除前后的合成音乐,调整包络参数达到最优效果。
时间: 2023-09-10 09:07:39 浏览: 298
以下是实现儿歌《一只哈巴狗》的音乐合成的MATLAB代码:
```
fs = 8000;
notes = [261.63 261.63 293.66 293.66 329.63 329.63 293.66 0 392 392 440 440 392 0];
durations = [0.5 0.5 0.5 0.5 0.5 0.5 1 0.5 0.5 0.5 0.5 0.5 1 1];
N = length(notes);
song = zeros(1, round(sum(durations)*fs));
envelope = linspace(0, 1, round(0.05*fs)); % 设置包络参数
n = 1;
for i = 1:N
t = 0:1/fs:durations(i);
note = sin(2*pi*notes(i)*t);
if i > 1 % 如果不是第一个音符,则添加包络
note(1:length(envelope)) = note(1:length(envelope)).*envelope;
note(end-length(envelope)+1:end) = note(end-length(envelope)+1:end).*fliplr(envelope);
end
song(n:n+length(note)-1) = note;
n = n+length(note);
end
sound(song, fs);
```
代码中,首先定义了乐谱中各个音符的频率和时长,然后计算出整首歌曲的采样点数,并创建一个用于存储歌曲的数组。接着定义了一个长度为0.05秒的包络,用于对相邻的音符之间的相位差进行平滑处理。在代码的主循环中,对于每个音符,生成对应的正弦波,并在非第一个音符时添加包络,最后将生成的音符拼接到歌曲数组中。最后使用MATLAB内置的`sound`函数播放歌曲。
为了消除相邻音符之间的噪声,我们对相邻的两个音符之间进行平滑处理。在上面的代码中,我们使用了一个简单的线性包络,即从0到1线性增加,然后从1到0线性减少,用于平滑相邻音符之间的相位差。我们可以调整包络的长度和形状,以达到最佳的效果。
阅读全文
相关推荐
















