Hello all, I have implemented a WIENER FILTER in the Spectral Domain for noise reduction purposes in Matlab (for speech signals). Question: Can the Wiener Filter factors in frequency domain have values above 1 or below -1? For power spectrum densities i simply used absolute values of the FFT of the signals. The noise is white noise. I use the following to calculate the Wiener Filter: H=PHIss./(PHIss+PHInn); Sr=H.*Y; H: Wiener Filter in frequency domain Y: FFT of Dirty Signal= FFT(Clean Speech Signal + Noise); Sr: FFT of my new improved noise-reduced signal PHIss: estimation of the power spectral density of the clean speech signal S in my case simply the absolute value of the clean speech signal. PHInn: estimation of the power spectral density of the noise N in my case simply the absolute value of the noise. I did not get too bad results with my implementation apart from the musical tones that i expected. With an SNR of 22dB I cannot hear any muscial tones, with an SNR 2.5dB I can hear some musical tones and with an SNR of -17dB I get a very distorted signal back from my noise reduction. But I sometimes calculate Wiener Filter elements in frequency domain that are well above or below 1. I figure that I dont have the excact Wiener Filter since I dont use PSDs. Best regards Stefan Bleiholder

# Wiener Filter Implementation Question.

Started by ●July 26, 2007

Reply by ●July 26, 20072007-07-26

On Thu, 26 Jul 2007 08:42:59 -0500, stefanb wrote:> Hello all, > > I have implemented a WIENER FILTER in the Spectral Domain for noise > > reduction purposes in Matlab (for speech signals). > > Question: > > Can the Wiener Filter factors in frequency domain have values above 1 or > > below -1? > For power spectrum densities i simply used absolute values of the FFT of > > the signals. The noise is white noise. > > I use the following to calculate the Wiener Filter: > > H=PHIss./(PHIss+PHInn); > > Sr=H.*Y; > > H: Wiener Filter in frequency domain > > Y: FFT of Dirty Signal= FFT(Clean Speech Signal + Noise); > > Sr: FFT of my new improved noise-reduced signal > > PHIss: estimation of the power spectral density of the clean speech signal > > S in my case simply the absolute value of the clean speech signal. > > PHInn: estimation of the power spectral density of the noise N in my case > > simply the absolute value of the noise. > > I did not get too bad results with my implementation apart from the > > musical tones that i expected. With an SNR of 22dB I cannot hear any > > muscial tones, with an SNR 2.5dB I can hear some musical tones and with an > > SNR of -17dB I get a very distorted signal back from my noise reduction. > > But I sometimes calculate Wiener Filter elements in frequency domain that > > are well above or below 1. I figure that I dont have the excact Wiener > > Filter since I dont use PSDs. > > > Best regards > Stefan BleiholderYou are doing a pointwise calculation of H^2 = P1/(P1 + P2), with P1 >= 0 and P2 >= 0. Think back to grade school and figure out if any points on |H| could ever be greater than one. One thing that you _will_ find with Wiener filtering is that your filter gain gets small for high noise -- to the point that in the limit as the SNR goes to infinity the filter gain goes to zero. This is sensible for the Wiener filter, because you're asking it to minimize the mean-squared error. It's not necessarily sensible for real life, because you're probably more interested in the maximum likelihood, not the MSE. -- Tim Wescott Control systems and communications consulting http://www.wescottdesign.com Need to learn how to apply control theory in your embedded system? "Applied Control Theory for Embedded Systems" by Tim Wescott Elsevier/Newnes, http://www.wescottdesign.com/actfes/actfes.html

Reply by ●July 26, 20072007-07-26

Hello I found my problem: Actually i did not implement H=PHIss./(PHIss+PHInn); but instead i implemented: H=PHIss./PHIyy; where PHIss is estimated by absolute(S), and PHIyy is estimated by absolute(Y); PHIss = abs(S); S= FFT of clean speech signal; PHIyy= abs(Y); Y = FFT of dirty speech signal; Now i see that I cannot have values above 1 since: H = (PHIss/PHInn) / (1+PHIss/PHInn) H= F/(F+1) which can never be above 1. with F= (PHIss/PHInn);

Reply by ●July 26, 20072007-07-26

You are right. It is obvious that I cannot get those values above 1. Thank you for you time. Stefan Bleiholder>You are doing a pointwise calculation of H^2 = P1/(P1 + P2), with P1 >=0>and P2 >= 0. Think back to grade school and figure out if any points on >|H| could ever be greater than one. > >One thing that you _will_ find with Wiener filtering is that your filter >gain gets small for high noise -- to the point that in the limit as the >SNR goes to infinity the filter gain goes to zero. This is sensible for >the Wiener filter, because you're asking it to minimize the mean-squared >error. It's not necessarily sensible for real life, because you're >probably more interested in the maximum likelihood, not the MSE. > >-- >Tim Wescott >Control systems and communications consulting >http://www.wescottdesign.com > >Need to learn how to apply control theory in your embedded system? >"Applied Control Theory for Embedded Systems" by Tim Wescott >Elsevier/Newnes, http://www.wescottdesign.com/actfes/actfes.html >