卷积、相关与FFT

设有两序列u和v,线性卷积就是把u沿y轴作镜面投影得到u(-),然后使u(-)沿x轴正向移动,保持v不动,将两序列重叠部分求和就得到响应的卷积,如下图所示:

image

设size(u)=M,size(v)=N,则卷积共有M+N-1项。

循环卷积与线性卷积不同的是,u(-)和v沿圆周排列,圆周长度为L,u和v不足L的部分补0,u(-)沿顺时针转动,对重叠部分求和,显然重叠部分是整个圆周,任何时刻都是L项求和。

如果M=N=L,则循环卷积就是圆周卷积。周期卷积就是线性卷积以M+N-1为周期的周期延拓。

如果循环卷积圆周长度L=M+N-1,则线性卷积可与之等价。

时域中的线性卷积与频域中的直接相乘对应,但频域中序列的长度应为M+N-1,如果频域中长度小于M+N-1,经IFFT变换后,时域信号是原卷积信号的一段,且序列起始处有差异;循环卷积与之类似,但L的长度没有要求,所以可以利用IFFT实现循环卷积。

xn=randn(1,10);
hn=[0,4,1,2,3];
y1n=conv(xn,hn); 
Na=length(xn);
Nb=length(hn);
N=Na+Nb-1;
x1=[xn,zeros(1,N-length(xn))];
x2=[hn,zeros(1,N-length(hn))];
n=[0:N-1]; 
for i=0:N-1 
n1=mod(-n+i,N);%change serial number
y2n(i+1)=x1*x2(n1+1)';
end
y3n=ifft(fft(x1).*fft(x2));
subplot(3,1,1);stem(y1n);
subplot(3,1,2);stem(y2n); 
subplot(3,1,3);stem(y3n);

image

相关函数的计算算:Rxy(m)=E{xn+myn*}=E{xnyn-m*}

非归一化的计算公式为:

\( R_{xy(m)}=\sum\limits_{n=0}^{N-m-1}x_{n+m}y_n*\quad m\geqslant 0 \)

用卷积表示为:

Rxy(m)=x(n)*y(-n)(m)

与线性卷积类似,但相关运算中u不用翻转,只是v在u上移动,求重叠部分的和。且相关运算有性质Rxy(m)=R*yx(-m),所以自相关函数是关于m=0对称的。

相应的函数为xcorr,下面为x=randn(1,100),y=xcorr(x,’biased’)的示意图:image

如上图,2N-1项自相关函数Rx(n)左右对称,所以其傅里叶变换为实数,值即为功率谱密度。

由于有偏的自相关估计为:

                     \[{R_X}(n) = \frac{1}{N}x\left( { - n} \right) * x\left( n \right)\]

由于

\[x(t) = \frac{1}{{2\pi }}\int {F(\omega ){e^{i\omega t}}d\omega }  = \frac{1}{{2\pi }}\int {F(\omega )[\cos (\omega t) + i\sin (\omega t)]d\omega } \]

所以\[x( - t) = x( - t)^* = \left( {\frac{1}{{2\pi }}\int {F(\omega )[\cos (\omega t) - i\sin (\omega t)]d\omega } } \right)^* = \frac{1}{{2\pi }}\int {F^*(\omega ){e^{i\omega t}}d\omega } \]

所以

               DFT(x(-t))=DFT*(x(t))

又根据卷积与DFT的关系可得:

\[{R_X}(n) = \frac{1}{N}IFFT\left\{ {{X^*}\left( k \right)X\left( k \right)} \right\} = IFFT\left( {\frac{{{{\left| {X\left( k \right)} \right|}^2}}}{N}} \right)\]

又由于功率谱密度为自相关函数的傅里叶变换,所以功率谱密度可以表达为:

\[{P_\omega } = \frac{{{{\left| {X\left( k \right)} \right|}^2}}}{N}\]

x=cos(2*pi*5/50*[0:199])+sin(2*pi*11/50*[0:199]);  
z=fft(x,2*200-1);  
Z=z.*conj(z)/200;  
cf=ifft(Z);  
cf1=[cf(201:end),cf(1:200)];  
cx=xcorr(x,'biased');  
plot(cf1)  
hold on  
plot(cx,'r')  
hold off


image

posted @ 2017-12-15 10:46  tck  阅读(4050)  评论(0编辑  收藏  举报