Hi everybody, I use the below matlab implementation of a Wiener filter, but I get strange artifacts when i process the noisy audio file. Can somebody take a look at my code and tell me if there is something wrong, or suspicios. When I process my noisy signal with this prgramm i get strange artifacts, for example i see in the spectogram that some coefficients in the noise speech at very high frequencies where the did not used to be any energy in the clean signal. Thanks for you time Jan %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [output] = denoising2( clean_speech, noise_signal, FS) %========================================================================== noisy_speech = clean_speech+noise_signal; DFT_LENGTH = 256; DOUBLE_DFT_LENGTH = 256; BLOCK_LENGTH = DFT_LENGTH/2; NBITS = 16; %========================================================================== size_speech = size(clean_speech); signal_length = size_speech(1,2); noisy_speech =[noisy_speech, zeros(1,1*DFT_LENGTH)]; noise_signal =[noise_signal, zeros(1,1*DFT_LENGTH)]; clean_speech =[clean_speech, zeros(1,1*DFT_LENGTH)]; extended_size = size(noisy_speech); BlockNo = floor( signal_length /BLOCK_LENGTH); %========================================================================== % initialize fields denoised_abs = zeros(extended_size); % Holds the calculation clean_end = zeros(extended_size); % Holds the calculation % create the window function window=hann(DFT_LENGTH); % beginning of high level loop tic for k = 1:1:BlockNo startxi = (k-1)*BLOCK_LENGTH; stopxi = startxi+DFT_LENGTH; % the different SIGNALS are chopped in BLOCKS of DFT_LENGTH size dirty = noisy_speech (1,startxi+1:stopxi); noise = noise_signal (1,startxi+1:stopxi); clean = clean_speech (1,startxi+1:stopxi); % window the dirty_windowed = dirty.*window'; noise_windowed = noise.*window'; clean_windowed = clean.*window'; DIRTYW = fft(dirty_windowed, DOUBLE_DFT_LENGTH); NOISE = fft(noise_windowed, DOUBLE_DFT_LENGTH); CLEAN = fft(clean_windowed, DOUBLE_DFT_LENGTH); D = abs(DIRTYW); N = abs(NOISE); C = abs(CLEAN); C2 = C.*C; N2 = N.*N; % a-priori-SNR nu = C2./N2; %wiener-filter H_abs = nu./(nu+1); H_abs = max(0, H_abs); CL = H_abs.*DIRTYW; den = ifft(CL); cl_end = ifft(CLEAN); temp3 = denoised_abs (:,(k-1)*BLOCK_LENGTH+1:(k-1)* BLOCK_LENGTH + DOUBLE_DFT_LENGTH); denoised_abs (:,(k-1)*BLOCK_LENGTH+1:(k-1)* BLOCK_LENGTH + DOUBLE_DFT_LENGTH) = temp3 + den ; tempC = clean_end (:,(k-1)*BLOCK_LENGTH+1:(k-1)* BLOCK_LENGTH + DOUBLE_DFT_LENGTH); clean_end (:,(k-1)*BLOCK_LENGTH+1:(k-1)* BLOCK_LENGTH + DOUBLE_DFT_LENGTH) = tempC + cl_end ; %========================================================================= end toc %========================================================================= output.denoised_abs = denoised_abs;%(:, BLOCK_LENGTH +1:BLOCK_LENGTH+1+signal_length-1); output.clean_end = clean_end; % writing the files save_file = denoised_abs; wavwrite( 0.9/max(abs(save_file))*save_file ,FS,NBITS, './ denoised_ABS.wav'); save_file = clean_end; wavwrite( 0.9/max(abs(save_file))*save_file ,FS,NBITS, './ rebuild_clean.wav');
Wiener filter implementation problem; Artifacts
Started by ●January 28, 2008