# Wiener Filter Implementation Question.

Started by July 26, 2007
```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

```
```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 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
```
```Hello I found my problem:

Actually i did not implement

H=PHIss./(PHIss+PHInn);

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);

```
```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
>
```