花了几个月时间终于认认真真把数字信号处理经典部分补完了,学到很多有用的理论,已经开始对某些实际问题的解决产生作用,昨天晚上听歌的时候突然想起一件事情。。。
evergreen是我高一时发现的一首歌,是wma格式,当时听的时候一直在纳闷,为什么总感觉歌声有点杂乱的声音,就是开始那种沙沙的乐器声音,现在来一探究竟,看把它搞出来干掉。。。
%先得找到那个沙沙声到底在哪里?
%因为现在也不知道沙沙是哪个频段的东西,只能尝试取点波形把它弄出来
clc
clear
m =40000;
[Y fs bits] = wavread('evergreen.wav',m);
num = (0:m-1);
% 取其中一个声道
Y = Y(:,1);
% 时域波形图
figure(1)
subplot 311
plot(num,Y,'g'),hold on;
plot(num(23500:29000),Y(23500:29000),'m');
xlabel('numbers');
ylabel('magnitude');
title('evergreen.wav wave data');
% 边听边看这片段,听了几遍,我严重怀疑紫色这坨就是沙沙,见下图
% 来仔细看看
noise = Y(23500:29000);
num_n = length(noise);
subplot 312
plot((0:num_n-1),noise,'m');
xlabel('numbers');
ylabel('magnitude');
% 看看沙沙是属于哪个频段,这里就不加其他窗抑制泄露了,就大概看一看
% 我觉得这里应该用功率谱或者能量谱恰当些。。
spect_noise = fft(noise);
% 求归一化的幅度大小
amp_n = abs(spect_noise)*2/num_n;
amp_n(1) = amp_n(1)/2;
f = (0:(num_n-1))/num_n*fs;
% 只画0~pi部分的频谱
subplot 313
plot(f(1:(num_n/2)),amp_n(1:(num_n/2)),'r');
xlabel('frequences/Hz');
ylabel('magnitude');
grid on;
% 可以看到,沙沙主要集中在3000Hz~8000Hz部分,可以弄一个带阻滤波器把它干掉
% 这里用FIR最优化设计,As和Rp意思意思就行了
% Hz
wp1 = 3000;
ws1 = 3500;
wp2 = 8000;
ws2 = 8500;
% dB
Rp = 0.1;
As = 60;
delta1 = (10^(Rp/20)-1)/(10^(Rp/20)+1);
delta2 = (1+delta1)*(10^(-As/20));
[N,f,A,weights] = firpmord([wp1 ws1 wp2 ws2],[1 0 1],[delta1 delta2 delta1],fs);
N = N + mod(N-1,2);
%保证为FIR类型I
hn = firpm(N-1,f,A,weights);
figure(2)
[H F] = freqz(hn,1,num_n,fs);
subplot 211
plot(F,20*log10(abs(H))),grid on;
xlabel('frequences/Hz');
ylabel('magnitude/dB');
title('FIRoptimize-Design')
subplot 212
plot(F,(180/pi)*unwrap(angle(H))),grid on;
xlabel('frequences/Hz');
ylabel('phase/°');
%看看滤波器的特性怎么样,感觉还阔以。。
% 设计完了,应该再验证FIR是否达到指标要求,这里就不麻烦了,懂得起就行了。。。
% 好了,来看看滤波效果如何?
bye_noise = filter(hn,1,Y);
figure(3)
subplot 211
plot(num,Y,'g');
xlabel('numbers');
ylabel('magnitude');
subplot 212
plot(num,bye_noise,'g');
xlabel('numbers');
ylabel('magnitude');
% 可以发现沙沙减小了很多。。。
% 好了,最后就用MATLAB把evergreen滤一滤,再保存成wav用播放器播播,看看效果咋样?
% 就选一部分,意思意思。。。
length_music = 2400000;
[evergreen fs bits] = wavread('evergreen.wav',length_music);
filter_ever = filter(hn,1,evergreen);
% 输出滤波后的文件,播来听听
wavwrite(filter_ever,fs,bits,'filter_ever.wav');
% 可以听到,虽然沙沙少了很多,但整体歌曲有点雾蒙蒙的赶脚,也变畸形了,这是当然的
% ,近朱者赤近墨者黑,和沙沙同流合污的信号也一并被干掉了,好了,过程最重要,就到
% 这里吧。
%欢迎交流,学习,感谢