花了几个月时间终于认认真真把数字信号处理经典部分补完了,学到很多有用的理论,已经开始对某些实际问题的解决产生作用,昨天晚上听歌的时候突然想起一件事情。。。

        evergreen是我高一时发现的一首歌,是wma格式,当时听的时候一直在纳闷,为什么总感觉歌声有点杂乱的声音,就是开始那种沙沙的乐器声音,现在来一探究竟,看把它搞出来干掉。。。

    首先得把歌曲转换成wav格式,因为MATLAB有直接读取wav格式的函数,注意,不同的格式转换工具出来的文件可能有点不一样,这里我已经转好了,可以下载来听听~~ evergreen

%先得找到那个沙沙声到底在哪里?

%因为现在也不知道沙沙是哪个频段的东西,只能尝试取点波形把它弄出来

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;

audiotrack声音沙沙的_audiotrack声音沙沙的

% 可以看到,沙沙主要集中在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); 
 
 
 
%保证为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/°');

%看看滤波器的特性怎么样,感觉还阔以。。

audiotrack声音沙沙的_audiotrack声音沙沙的_02

% 设计完了,应该再验证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');

% 可以发现沙沙减小了很多。。。

audiotrack声音沙沙的_audiotrack声音沙沙的_03

% 好了,最后就用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');

% 可以听到,虽然沙沙少了很多,但整体歌曲有点雾蒙蒙的赶脚,也变畸形了,这是当然的

% ,近朱者赤近墨者黑,和沙沙同流合污的信号也一并被干掉了,好了,过程最重要,就到

% 这里吧。

%欢迎交流,学习,感谢