```>That's really the problem with actually using a Wiener filter; you
>have to have knowledge of the statistics of the filter input and how
>using finite-length FFTs to judge the noise and signal spectra; this
>will not give you consistent results (e.g. the fact that you
>calculated negative values for the signal magnitude). This just isn't
>the way to go about implementing a noise-removal filter. You could
>instead use an adaptive filter; an LMS filter is easy to implement and
>
>Jason
>
>

Hello Jason,

I think my problem is not so much the Wiener Filter, or the estimation of
the noise. My problem is when I implement the Wiener Filter as an Spectral
Substraction.

I do not get good results even when I dont smooth the noise ffts over one
block. I mean when I subtract the magnitude of the actual noise, I get
For example:

S_estimated=abs(Y)-abs(N);

gives me totally different results as:

S_estimated2=abs(Y-N);

I know the phase is different, but isnt this what spectral substraction
says or something like this:

S_qu = abs(Y).*abs(Y)-abs(N).*abs(N);

I think this is where my problem is. The estimation of the clean speech
from the estimation of the noise.

best regards,

Stefan

```
```On Aug 2, 6:17 am, "stefanb" <stefanb52-k...@yahoo.de> wrote:
> Hello all,
>
> I implemented a blockwise Wiener Filter with Matlab like this:
>
> H = a_priori_SNR./(a_priori_SNR+1)
>
> a_priori_SNR = S./N;
>
> S = magnitude of fft of clean signal s; S= abs(fft(s)), of current block
> N = magnitude of fft of noise  n;  N= abs(fft(n)), of current block
> Y = magnitude of fft of noisy signal  y;  Y= abs(fft(y)), of current
> block
>
> Since in real life I have neither the signal nor the noise, I started with
> estimating the noise by smoothing the actual noise over one block. I've
> been told that I should also get pretty good results with it. But I dont.
> For smoothing I tried both magnitude smoothing of noise and squared
> magnitude smoothing:
>
> N_smoothed = old_N*0.9 + N;
> old_N = N;
>
> S_smoothed = Y-N_smoothed;
>
> where
> S_smoothed = estimation of the clean speech signal magnitude.
> old_N      = magnitude of fft of noise n; of the last block
>
> Now my question:
>
> When I calculate S_smoothed, I even get negative values which make no
> sense to me since I try to estimate a magnitude. The same happens if I do
> squared magnitude estimation the same way.
> I also squared the estimated N_smoothed and S_smoothed to calculate the a
> priori SNR and then the wiener filter. But it all sounds pretty bad. I
> used a noisy signal with SNR of 1.5 dB. Should I try to also smooth over
> my estimation of clean speech?
>
> best regards,
>
> Stefan Bleiholder

That's really the problem with actually using a Wiener filter; you
have to have knowledge of the statistics of the filter input and how
using finite-length FFTs to judge the noise and signal spectra; this
will not give you consistent results (e.g. the fact that you
calculated negative values for the signal magnitude). This just isn't
the way to go about implementing a noise-removal filter. You could
instead use an adaptive filter; an LMS filter is easy to implement and

Jason

```
```Hello all,

I implemented a blockwise Wiener Filter with Matlab like this:

H = a_priori_SNR./(a_priori_SNR+1)

a_priori_SNR = S./N;

S = magnitude of fft of clean signal s; S= abs(fft(s)), of current block
N = magnitude of fft of noise  n;  N= abs(fft(n)), of current block
Y = magnitude of fft of noisy signal  y;  Y= abs(fft(y)), of current
block

Since in real life I have neither the signal nor the noise, I started with
estimating the noise by smoothing the actual noise over one block. I've
been told that I should also get pretty good results with it. But I dont.
For smoothing I tried both magnitude smoothing of noise and squared
magnitude smoothing:

N_smoothed = old_N*0.9 + N;
old_N = N;

S_smoothed = Y-N_smoothed;

where
S_smoothed = estimation of the clean speech signal magnitude.
old_N      = magnitude of fft of noise n; of the last block

Now my question:

When I calculate S_smoothed, I even get negative values which make no
sense to me since I try to estimate a magnitude. The same happens if I do
squared magnitude estimation the same way.
I also squared the estimated N_smoothed and S_smoothed to calculate the a
priori SNR and then the wiener filter. But it all sounds pretty bad. I
used a noisy signal with SNR of 1.5 dB. Should I try to also smooth over
my estimation of clean speech?

best regards,

Stefan Bleiholder
```