0
$\begingroup$

I intend to whiten the spectrum of a time series using a point-wise normalization in the frequency domain.

In my first test, it looks pretty good.

figure;
n = 2e3;
t = 1:n;
m = n/2+1;
f = linspace(0,1,m);
x = rand(1,n) - 0.5;
y = fft(x);
subplot(2,2,1); plot(t,x,'k'); 
axis tight; xlabel('t/s'); title('original signal x');
subplot(2,2,2); plot(f,abs(y(1:m)),'k'); 
axis tight; xlabel('f/hz'); title('original spectrum');
y1 = y ./ abs(y);
x1 = real(ifft(y1));
y2 = fft(x1);
x2 = real(ifft(y2));
subplot(2,2,3); plot(t,x1,'k',t,x2-x1,'r'); 
axis tight; xlabel('t/s'); title('whitened signal x1(black) and x2-x1(red)');
subplot(2,2,4); plot(f,abs(y1(1:m)),'k',f,abs(y2(1:m)),'r');
axis tight; xlabel('f/hz'); title('whitened spectrum y1(black) and y2(red)');

The spectrum is flat after whitening.

figure1

But when I windowed the spectrum, sth strange happened.

figure;
n = 2e3;
t = 1:n;
m = n/2+1;
f = linspace(0,1,m);
x = rand(1,n) - 0.5;
y = fft(x);
subplot(2,2,1); plot(t,x,'k'); 
axis tight; xlabel('t/s'); title('original signal x');
subplot(2,2,2); plot(f,abs(y(1:m)),'k'); 
axis tight; xlabel('f/hz'); title('original spectrum');
y1 = y ./ abs(y);  
k = n/10;
w = sin(linspace(0,pi/2,k));
y1(1:k) = y1(1:k) .* w;
y1(m:-1:m-k+1) = y1(m:-1:m-k+1) .* w;
y1(n-m+3:n) = y1(m-1:-1:2);    
x1 = real(ifft(y1));
y2 = fft(x1);
x2 = real(ifft(y2));
subplot(2,2,3); plot(t,x1,'k',t,x2-x1,'r'); 
axis tight; xlabel('t/s'); title('whitened signal x1(black) and x2-x1(red)');
subplot(2,2,4); plot(f,abs(y1(1:m)),'k',f,abs(y2(1:m)),'r');
axis tight; xlabel('f/hz'); title('whitened spectrum y1(black) and y2(red)');

As shown in subplot 3, x1 and x2 are the same (the difference is zero; see red line), but their spectrum in subplot 4 (black and red) is different.

After IFFT y1 to x1 and FFT x1 to y2, y2 differs from y1.

figure2

$\endgroup$
13
  • $\begingroup$ you will notice a rough periodicity in the amplitude envelope of your "whitened signal". it's 12 cycles over the entire length. you might also notice that the spectrum of the original signal has its energy as a normalized frequency of about 1/12. i wonder if they have anything to do with each other? $\endgroup$ – robert bristow-johnson May 11 '14 at 4:06
  • $\begingroup$ How does it look when you plot y2? And what are you doing to get the spectrum of x2? It should be the same as y2. $\endgroup$ – MackTuesday May 11 '14 at 4:54
  • $\begingroup$ Could you link to your signal x, so we can see for ourselves? $\endgroup$ – Matt L. May 11 '14 at 8:10
  • $\begingroup$ @MackTuesday, abs(y2) is flat. The spectral magnitude of x2 is simply obtained by fft(x2); It's curious. $\endgroup$ – Lee May 11 '14 at 9:10
  • $\begingroup$ @MattL., it's arbitrary to generate a signal using random function. I edited the body text. $\endgroup$ – Lee May 11 '14 at 9:12
1
$\begingroup$

As suggested by @Drazick, I post as an answer.

The good code according to the comments:

figure;
n = 2e3;
t = 1:n;
m = n/2+1;
f = linspace(0,1,m);
x = rand(1,n) - 0.5;
y = fft(x);
subplot(2,2,1); plot(t,x,'k'); 
axis tight; xlabel('t/s'); title('original signal x');
subplot(2,2,2); plot(f,abs(y(1:m)),'k'); 
axis tight; xlabel('f/hz'); title('original spectrum');
y1 = y ./ abs(y);
x1 = real(ifft(y1));
y2 = fft(x1);
x2 = real(ifft(y2));
subplot(2,2,3); plot(t,x1,'k',t,x2-x1,'r'); 
axis tight; xlabel('t/s'); title('whitened signal x1(black) and x2-x1(red)');
subplot(2,2,4); plot(f,abs(y1(1:m)),'k',f,abs(y2(1:m)),'r');
axis tight; xlabel('f/hz'); title('whitened spectrum y1(black) and y2(red)');

The spectrum is flat after whitening.

enter image description here

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.