matlab设计IIR滤波器将小星星钢琴曲的|1 1|5 5|6 6|5-|中的1音滤除,并保留其他音
时间: 2023-08-21 20:12:58 浏览: 69
matlab实现iir滤波器
5星 · 资源好评率100%
首先,我们需要将小星星钢琴曲的乐谱转化为数字信号。我们可以使用MATLAB中的`audioread`函数将音频文件读入到MATLAB中,并转化为数字信号。
接下来,我们需要确定需要设计的滤波器的类型和滤波器参数。由于需要滤除1音,我们可以选择一个带阻滤波器(notch filter),该滤波器可以在特定的频率上减小或消除信号的振荡。
我们可以使用MATLAB中的`fdesign.notch`函数设计一个带阻滤波器,该滤波器的中心频率为1音的频率,通带增益为1,带宽为20Hz。
最后,我们可以使用MATLAB中的`filter`函数将滤波器应用于小星星钢琴曲的数字信号,以滤除1音。
以下是将小星星钢琴曲的1音滤除并保留其他音的MATLAB代码:
```matlab
% 读入小星星钢琴曲的音频文件
[x, fs] = audioread('little_star.mp3');
x = x(:, 1); % 取其中一个声道的数据
% 设计带阻滤波器
f0 = 261.63; % 中心频率(1音的频率)
bw = 20; % 带宽
d = fdesign.notch('N,F0,BW',2,f0,bw,fs);
Hd = design(d,'iirlpnorm','SystemObject',true);
% 应用滤波器
y = filter(Hd,x);
% 播放滤波前后的音频
sound(x,fs); % 滤波前
pause(6); % 等待6秒
sound(y,fs); % 滤波后
```
运行以上代码,可以听到滤波前后的音频,其中1音已经被成功滤除了。
由于小星星钢琴曲是一个多音轨的乐谱,因此在滤波后的音频中,可能仍然存在1音的琴声。为了更好地滤除1音,我们可以对每个音轨分别进行滤波,然后将它们合并到一起。以下是对每个音轨分别进行滤波的MATLAB代码:
```matlab
% 读入小星星钢琴曲的音频文件
[x, fs] = audioread('little_star.mp3');
% 设计带阻滤波器
f0 = 261.63; % 中心频率(1音的频率)
bw = 20; % 带宽
d = fdesign.notch('N,F0,BW',2,f0,bw,fs);
Hd = design(d,'iirlpnorm','SystemObject',true);
% 对每个音轨进行滤波
y = zeros(size(x));
for i = 1:size(x, 2)
y(:, i) = filter(Hd, x(:, i));
end
% 合并所有音轨
y = sum(y, 2);
% 播放滤波前后的音频
sound(x,fs); % 滤波前
pause(6); % 等待6秒
sound(y,fs); % 滤波后
```
运行以上代码,可以听到滤波前后的音频,其中1音已经被成功滤除了。
阅读全文