4.5 Thực hiện và đánh giá thuật toán
Trong quá trình nghiên cứu và triển khai thuật toán ta nhận thấy các thông số sau ảnh hưởng lớn đến thuật toán:
NoiseMargin: Là ngưỡng để nhận biết nhiễu trong VAD. Mặc định của thuật toán NoiseMargin sẽ là 3db.
IS: Hệ số chỉ thời gian không có tiếng nói đầu tiên trong mỗi file âm thanh được dùng để tính toán nhiễu ban đầu. Do khi kiểm tra những đoạn im lặng ban đầu trong các file sạch ta nhận thấy rằng đối với từng file thì từ 0.15s đến 0.2s là những đoạn im lặng.
Gramma: Là hệ số quyết định nhiễu sẽ được trừ theo biên độ hay công suất. Ta chọn giá trị Gramma là 1 tức là thuật toán Subtraction sẽ trừ nhiễu theo biên độ còn Gramma là 2 thì sẻ trừ nhiễu theo công suất.
Chúng ta thực hiện thuật toán trừ phổ xử lý các file âm thanh bị nhiễu xung quanh tương ứng với SNR =15dB và các tham số: Hamming SP = 0.4, L = 25ms, Gamma = 1 (phổ biên độ), Gamma = 2 (phổ công suất), IS = 0.25ms, Beta = 0.03, Noisemargin = 3, Hangover =8.
Dạng sóng và phổ của tín hiệu sạch:
Hình 4.3 Dạng sóng và phổ của tín hiệu sạch
Có thể bạn quan tâm!
- Tìm hiểu thuật toán trừ phổ trong xử lý tiếng nói - 1
- Tìm hiểu thuật toán trừ phổ trong xử lý tiếng nói - 2
- Phép Biến Đổi Fourier Của Tín Hiệu Rời Rạc Dtft
- Thang Điểm Đánh Giá Chất Lượng Tiếng Nói Theo Mos .
- Sơ Đồ Thực Hiện Và Đánh Giá Thuật Toán Tăng Cường.
- Tìm hiểu thuật toán trừ phổ trong xử lý tiếng nói - 7
Xem toàn bộ 58 trang tài liệu này.
Trước khi xử lý nhiễu:
Hình 4.4 Dạng sóng và phổ của tín hiệu bị nhiễu với SNR = 15dB
Sau khi xử lý triệt nhiễu bằng thuật toán với Gamma = 1:
Hình 4.5 Dạng sóng và phổ của tín hiệu sau khi xử lý nhiễu bằng thuật toán trừ phổ biên độ
Sau khi xử lý triệt nhiễu bằng thuật toán với Gamma = 2:
Hình 4.6 Dạng sóng và phổ của tín hiệu sau khi xử lý nhiễu bằng thuật toán trừ phổ công suất.
Chúng ta thực hiện thuật toán trừ phổ xử lý các file âm thanh bị nhiễu xung quanh tương ứng với SNR = 5dB và các tham số: Hamming SP = 0.4, L = 25ms, Gamma = 1 (phổ biên độ), Gamma = 2 (phổ công suất), IS = 0.25ms, Beta = 0.03, Noisemargi = 3, Hangover = 8.
Dạng sóng và phổ của tín hiệu sạch:
Hình 4.7 Dạng sóng và phổ của tín hiệu sạch
Trước khi xử lý nhiễu:
Hình 4.8 Dạng sóng và phổ của tín hiệu bị nhiễu với SNR = 5dB
Sau khi xử lý triệt nhiễu bằng thuật toán với Gamma = 1:
Hình 4.9 Dạng sóng và phổ của tín hiệu sau khi xử lý nhiễu bằng thuật toán trừ phổ biên độ
Sau khi xử lý triệt nhiễu bằng thuật toán với Gamma = 2:
Hình 4.10 Dạng sóng và phổ của tín hiệu sau khi xử lý nhiễu bằng thuật toán trừ phổ công suất.
Nhận xét
Sau khi nghe file âm thanh của tín hiệu sạch, tín hiệu sau khi xử lý nhiễu, dựa trên dạng sóng và phổ của tín hiệu sạch, tín hiệu sau khi xử lý triệt nhiễu bằng thuật
toán SS, ta có thể đưa ra nhận xét như sau:
Thuật toán SS có thể xử lý triệt nhiễu tốt hơn ở môi trường có SNR cao hơn, ví dụ với file nhiễu có mức SNR=15dB cho ra file rất sạch còn với file nhiễu có mức SNR=5dB nhiễu còn tương đối nhiều và xử lý tốt hơn với đối với tín hiệu bị nhiễu biến đổi chậm và có phân bố đều.
Ta nhận thấy rằng đối với hệ số gamma=2 tức là trừ phổ theo công suất thì nhiễu bị nén rất ít, file đầu ra không tốt bằng hệ số gamma=1trừ phổ theo biên độ.
Có tính hiệu quả đối với nhiễu ở mức SNR thấp.
4.6 Kết luận chương
Đối với từng loại nhiễu khác nhau thì tác động của các thuật toán tăng cường là khác nhau.
Đối với từng mức nhiễu khác nhau thì thuật toán cũng tác động cũng khác
nhau.
4.7 Matlap Code của thuận toán giảm nhiễu
function [output,Speech]=H_SSBoll79(signal,fs,IS)
% OUTPUT=SSBOLL79(S,FS,IS)
% Spectral Subtraction based on Boll 79. Amplitude spectral subtraction
% Includes Magnitude Averaging and Residual noise Reduction
%
% INPUT: Signal is the noisy signal, fs is the sampling frequency and IS is the initial
% silence (noise only) length in seconds (default value is .25 sec)
%
% OUTPUT: output is enhanced speech signal; Speech is VAD vector
%
% April-05
% Esfandiar Zavarehei
if (nargin<3 | isstruct(IS))
IS=0.05 %seconds end
W=fix(.025*fs); %Window length is 25 ms nfft=W;
SP=.4; %Shift percentage is 40% (10ms) %Overlap-Add method works good with this value(.4)
wnd=hamming(W);
% wnd=rectwin(W);
% IGNORE THIS SECTION FOR CAMPATIBALITY WITH ANOTHER PROGRAM FROM HERE.....
if (nargin>=3 & isstruct(IS))%This option is for compatibility with another programme
W=IS.windowsize SP=IS.shiftsize/W; nfft=IS.nfft; wnd=IS.window; if isfield(IS,'IS')
IS=IS.IS;
else
IS=.25;
end end
% .......IGNORE THIS SECTION FOR CAMPATIBALITY WITH ANOTHER PROGRAM T0 HERE
NIS=fix((IS*fs-W)/(SP*W) +1);%number of initial silence segments Gamma=2;% (1 for magnitude spectral subtraction 2 for power spectrum
subtraction)
disp(' Segmentation'); y=segment(signal,W,SP,wnd); disp(' FFT');
Y=fft(y,nfft);
YPhase=angle(Y(1:fix(end/2)+1,:)); %Noisy Speech Phase Y=abs(Y(1:fix(end/2)+1,:)).^Gamma;%Specrogram numberOfFrames=size(Y,2);
FreqResol=size(Y,1);
%size(Y),
disp(' Noise Initialization');
N=mean(Y(:,1:NIS)')'; %initial Noise Power Spectrum mean NRM=zeros(size(N));% Noise Residual Maximum (Initialization) NoiseCounter=0;
NoiseLength=9;%This is a smoothing factor for the noise updating Beta=0.03
disp(' Magnitude Averaged'); YS=Y; %Y Magnitude Averaged for i=2:(numberOfFrames-1)
YS(:,i)=(Y(:,i-1)+Y(:,i)+Y(:,i+1))/3;
end
disp(' Spectral Subtraction'); X=zeros(FreqResol,numberOfFrames); for i=1:numberOfFrames
[NoiseFlag, SpeechFlag, NoiseCounter, Dist]=vad(Y(:,i).^(1/Gamma),N.^(1/Gamma),NoiseCounter); %Magnitude Spectrum Distance VAD
Speech(i,1)=SpeechFlag; if SpeechFlag==0
N=(NoiseLength*N+Y(:,i))/(NoiseLength+1); %Update and smooth noise NRM=max(NRM,YS(:,i)-N);%Update Maximum Noise Residue X(:,i)=Beta*Y(:,i);
else
D=YS(:,i)-N; % Specral Subtraction
if i>1 && i<numberOfFrames %Residual Noise Reduction for j=1:length(D)
if D(j)<NRM(j)
D(j)=min([D(j) YS(j,i-1)-N(j) YS(j,i+1)-N(j)]);
end end
end
X(:,i)=max(D,0);
end end
disp(' Synthesis'); output=OverlapAdd2(X.^(1/Gamma),YPhase,W,SP*W); function
ReconstructedSignal=OverlapAdd2(XNEW,yphase,windowLen,ShiftLen);
%Y=OverlapAdd(X,A,W,S);
%Y is the signal reconstructed signal from its spectrogram. X is a matrix
%with each column being the fft of a segment of signal. A is the phase
%angle of the spectrum which should have the same dimension as X. if it is
%not given the phase angle of X is used which in the case of real values is
%zero (assuming that its the magnitude). W is the window length of time
%domain segments if not given the length is assumed to be twice as long as
%fft window length. S is the shift length of the segmentation process ( for
%example in the case of non overlapping signals it is equal to W and in the
%case of %50 overlap is equal to W/2. if not givven W/2 is used. Y is the
%reconstructed time domain signal.
%Sep-04
%Esfandiar Zavarehei if nargin<2
yphase=angle(XNEW); end
if nargin<3 windowLen=size(XNEW,1)*2;
end
if nargin<4 ShiftLen=windowLen/2;
end
if fix(ShiftLen)~=ShiftLen ShiftLen=fix(ShiftLen);
disp('The shift length have to be an integer as it is the number of samples.')
disp(['shift length is fixed to ' num2str(ShiftLen)]) end
[FreqRes FrameNum]=size(XNEW); Spec=XNEW.*exp(j*yphase);
if mod(windowLen,2) %if FreqResol is odd Spec=[Spec;flipud(conj(Spec(2:end,:)))];
else
Spec=[Spec;flipud(conj(Spec(2:end-1,:)))]; end
sig=zeros((FrameNum-1)*ShiftLen+windowLen,1); weight=sig;
for i=1:FrameNum start=(i-1)*ShiftLen+1; spec=Spec(:,i);
sig(start:start+windowLen-1)=sig(start:start+windowLen- 1)+real(ifft(spec,windowLen));
end ReconstructedSignal=sig;
function [NoiseFlag, SpeechFlag, NoiseCounter, Dist]=vad(signal,noise,NoiseCounter,NoiseMargin,Hangover)
%[NOISEFLAG, SPEECHFLAG, NOISECOUNTER, DIST]=vad(SIGNAL,NOISE,NOISECOUNTER,NOISEMARGIN,HANGOVER)
%Spectral Distance Voice Activity Detector
%SIGNAL is the the current frames magnitude spectrum which is to labeld as
%noise or speech, NOISE is noise magnitude spectrum template (estimation),
%NOISECOUNTER is the number of imediate previous noise frames, NOISEMARGIN
%(default 3)is the spectral distance threshold. HANGOVER ( default 8 )is
%the number of noise segments after which the SPEECHFLAG is reset (goes to
%zero). NOISEFLAG is set to one if the the segment is labeld as noise
%NOISECOUNTER returns the number of previous noise segments, this value is
%reset (to zero) whenever a speech segment is detected. DIST is the