Finding the auto-correlation of the noise signal x explicitly using the FFT() and IFFT() functions
    12 vues (au cours des 30 derniers jours)
  
       Afficher commentaires plus anciens
    
Hello,
    Been trying for hours to calculate the auto-correlation of a noise signal without using the xcorr operator and not sure if my results are right. My tutor wants us to find the auto-correlation  by calculating the auto-spectra, the auto-covariance from the spectra and finaly the auto-correlation from the auto-covariance without using matlab operators. My plots  show a peak at zero, which I think is positive, with the auto-correlation having a peak at zero with the max value of 1 in the vertical axis, which seems correct. Although my x-axis show the 0:N points and I don't know how to display the x-axis correct. From what I understand should be a time-axis. I'm also not sure my results are correct or it was just a coincidence. Would be good to have some feedback and tips. The code is underneath a bit long but I hope it's clear. thanks you so much. Code:
fs=11025; %sampling frequency
N=1024; %number of points
T=N/fs; %time
x=2*rand(N,1)-1; %generate noise signal
%creating a delay of signal x
d=zeros(64,1);
x_delay=cat(1,d,x);
%fft of signal x and delay
X=fft(x);
X_delay=fft(x_delay);
%windowing signal x
h=hanning(2*N);
hX=X.*h(1:N);
HX=fft(hX);
%windowing signal x_delay
H=hanning(2*length(X_delay));
hX_delay=X_delay.*H(1:length(X_delay));
HX_delay=fft(hX_delay);
%finding the auto-spectra
for i=1:N
Sxx(i)= (HX(i).*conj(HX_delay(i))/T);
end
%finding auto-covariance
Sxxt=ifft(Sxx);
%plotting the auto-covariance
subplot(4,1,2)
plot(abs(Sxxt));
title('auto-covariance')
%finding the boundary of the auto-covariance Sxx(0)
Sxx0=mean(Sxx);
%finding the auto-correlation
Rxx=Sxxt/Sxx0;
%plotting the auto-correlation
subplot(4,1,3);
plot(d,abs(Rxx));
title('auto-correlation')
0 commentaires
Réponse acceptée
  Wayne King
    
      
 le 7 Mar 2012
        Hi, here is an example:
      x = randn(16,1);
      xpsdmag = abs(fft(x,2^nextpow2(2*length(x)-1))).^2;
      acf = ifft(xpsdmag);
      acf = acf(1:length(x));
      acf = acf./acf(1);
      % compare to xcorr()
      [xc,lags] = xcorr(x,'coeff');
      xc = xc(length(x):end);
      isequal(xc,acf)
3 commentaires
  Wayne King
    
      
 le 7 Mar 2012
				Hi Catarina, I did that just so I could demonstrate perfect agreement with xcorr() 
To plot the normalized acf I would use stem()
 x = randn(16,1);
 xpsdmag = abs(fft(x,2^nextpow2(2*length(x)-1))).^2;
 acf = ifft(xpsdmag);
 acf = acf(1:length(x));
 acf = acf./acf(1);
 stem(0:length(acf)-1,acf); set(gca,'ylim',[-1.5 1.5]);
 xlabel('Lags');
  Tahariet Sharon
 le 10 Mar 2018
				Hi,
I was just wondering, if you don't square (.^2) in line 2 of your answer, would it make a difference if we are interested in computing the ACF? I have seen this formula used for ACF but without squaring the absolute value. Thanks!
Plus de réponses (0)
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


