📄 solute.m
字号:
%Spectral Subtraction Algorithm
winsize=128; % 窗长
n=0.04; % 噪声水平
[speech,fs,nbits]=wavread('speech_clean.wav'); % 读入数据
size=length(speech);
numofwin=floor(size/winsize); % 帧数
%加窗
ham=hamming(winsize)'; %Generates Hamming Window
hamwin=zeros(1,size); %Vector for window gain
enhanced=zeros(1,size); %Vector for enhanced speech
%产生带噪信号
x=speech'+ n*randn(1,size); %Contaminates signal with white noise
%噪声估计
noisy=n*randn(1,winsize); %Sample of noise
N = fft(noisy);
nmag= abs(N); %Estimated noise magnitude spectrum
for q=1:2*numofwin-1
frame=x(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2); %50 percent overlap
hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+ham; %Window gain
%对带噪语音进行DFT
y=fft(frame.*ham);
mag = abs(y); %Magnitude Spectrum
phase = angle(y); %Phase Spectrum
%幅度谱减
for i=1:winsize
if mag(i)-nmag(i)>0
clean(i)= mag(i)-nmag(i);
else
clean(i)=0;
end
end
%在频域中重新合成语音
spectral= clean.*exp(j*phase);
%IDFT并重叠相加
enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+real(ifft(spectral));
end
% 除去Hamming窗引起的增益
for i=1:size
if hamwin(i)==0
enhanced(i)=0;
else
enhanced(i)=enhanced(i)/hamwin(i);
end
end
SNR1 = 10*log10(var(speech')/var(noisy)); %加噪语音信噪比
SNR2 = 10*log10(var(speech')/var(enhanced-speech')); %增强语音信噪比
wavwrite(x,fs,nbits,'noisy.wav'); %输出带噪信号
wavwrite(enhanced,fs,nbits,'enhanced.wav'); %输出增强语音
figure(1),subplot(3,1,1);plot(speech'); %原始语音波形
title(['Original Voice (n=',num2str(n),')' ]);
figure(2),specgram(speech'); %原始语音语谱
title(['Original Voice (n=',num2str(n),')' ]);
figure(1),subplot(3,1,2); plot(x);
title(['Noise Added (SNR=',num2str(SNR1),'dB)']);
figure(3),specgram(x); %加噪语音语谱
title(['Noise Added (SNR=',num2str(SNR1),'dB)']);
figure(1),subplot(3,1,3);plot(enhanced);
title(['Improved Voice (SNR=',num2str(SNR2),'dB SNR=',num2str(SNR2-SNR1),'dB)']);
figure(4),specgram(enhanced);
title(['Improved Voice (SNR=',num2str(SNR2),'dB ¤SNR=',num2str(SNR2-SNR1),'dB)']);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -