Phase shift using FFT

  1. What I want to do is apply a frequency-independent phase shift to a Gaussian Noise signal. Obviously I can just invert it to get a pi shift. Also I can take the Hilbert transform to get a pi/2 shift and I can invert that to give myself in effect a 3/2pi shift. BUT..... what I want to do is to be able to apply any phase shift, 10, 20, 30 degrees etc.

    The way I have been thinking about this is that I can take the FFT of the noise and get the magnitude and phase information, and then I could manipulate the phase but leave the magnitude the same and take the IFFT to get my phase-shifted signal. Here is an example bit of matlab code doing this on a single sinusoid. As it is here the code doesn't work. But if you change the phase shift p from pi/2 to pi then it does? Is there something I'm missing. Perhaps I need to apply the phase shift differently to the positive and negative parts of the FFT? Or is it something to do with the fact that theta is distributed on [-pi pi] and when I add "p" I change this and make it ambiguous or something?

    sr=10000;
    dt=1/sr;
    len=0.5;
    t=0:dt:len;
    f=500;
    %generate signal
    sig=sin(2*pi*f*t);
    %Define a phase shift in rads
    p=pi/2;
    %Get the FFT of the signal
    z=fft(sig);
    %Get the magnitude
    mag=abs(z);
    %Get the phase
    theta=angle(z);
    %Add the phase shift onto the phase
    theta=theta+p;
    %Set the new real and imag parts of the spectrum
    R=mag.*cos(theta);
    I=mag.*sin(theta);
    %Make the new spectrum
    spec=complex(R,I);
    %Get the new signal
    newsig=real(ifft(spec));
    %plot the signals
    figure;plot(t,sig);hold on; plot(t,newsig,'g');
     
  2. jcsd
Know someone interested in this topic? Share a link to this question via email, Google+, Twitter, or Facebook

Have something to add?

0
Draft saved Draft deleted