多重互相关可以用多重傅里叶变换表示吗?

信息处理 傅里叶变换 卷积 互相关
2022-02-05 08:30:10

一篇文章解释了两个信号的互相关可以由

F1{F{x(t)}F{y(t)}}

这是否可以推广到等式中形式的多个信号的互相关? (1)

(1)F1{F{x(t)}jn1F{yj(t)}}

或者也许这在等式中? (2)

(2)F1{F{x(t)}(jn1F{yj(t)})}

1个回答

假设我们将“多个信号的互相关”解释为一组信号中的每一个与参考信号的互相关结果,这将导致与两个参数的相关性,其中表示我们将在互相关函数中使用的典型延迟参数,表示与多个信号中的每一个相关联的索引。当我们想要参考信号给出的多个其他信号之间的互相关时,结果将由下式给出:ρ(τ,n)τnx(t)yn(t)

ρ(τ,n)=F1{F{x(t)}F{yn(t)}}

需要注意的是,通常给出的 FFT 方法会产生圆形互相关函数,而不是线性互相关函数(除非我们将填充零填充到两倍的长度)。通过将内部 FFT 的每个结果以列形式放置(假设默认傅里叶逆变换在 MATLAB、Octave 和 Python 中跨列操作),可以将上述形式作为单个紧凑矩阵方程求解,其中的傅里叶变换只会在每一列中重复。两个矩阵的乘积将是逐个元素的乘积,而不是向量点积(对于行和)。x(t)crc=arcbrcrc

如果感兴趣的是其他东西,例如每个互相关的平均值,或者 OP 最终感兴趣的与多个波形的互相关相关的任何参数,则可以进一步处理得到的矩阵。

为了演示,我将这种技术用于多个信号的压缩互相关,作为对 GPS 信号单次捕获的多普勒偏移和代码延迟的联合解决方案,如下图所示。这种技术可用于快速采集任何我们将使用相关技术来解决频率和时间偏移的信号。结果是“一次性”粗略频率和时间校正,将信号正确置于接收器中典型载波恢复和定时恢复环路的跟踪范围内。

频率和延迟

完整的 MATLAB 代码可在此处获得,其中包含以下主要操作的简化版本。

给定两个时域信号,使用以下方法计算两个信号之间的多个互相关函数(相关与延迟)ab

ifft{fft{bm}(fft{am})}

其中是一个矩阵,其中每一列是 FFT 结果循环旋转一个 bin 并因此表示由间隔的多普勒频率偏移,其中是采样率,是 bin 数(或时域中的样本数),而是一个矩阵,其中每一列都是的 FFT (重复)。amfs/NfsNbmb

%============================================================
% create all doppler versions of a by shifting the fft:
%============================================================
a=a(:);    % force column vectors
b=b(:);
N=max(length(a),length(b));
fft_a= fft(a,N);
% frequency axis for all doppler bins -pi to pi
freq_axis=[-floor((N-1)/2):floor(N/2)]*2*pi/N;  

% create Hankel matrix for all Dopplers (each column is the fft
% of vector a at a different Doppler offset)  
fft_idx=(1:N)';
fft_dopplers = fft_idx(:,ones(N,1))+freq_index(ones(N,1),:);
fft_dopplers= mod(fft_dopplers-1,N)+1;    %Hankel subscripts
fft_dopplers(:)=  fft_a(fft_dopplers);      %fill data  
% alternate method if solving for all Doppler bins (processing intensive):
% fft_all_dopplers= hankel(fft_a,[fft_a(end); fft_a(2:end)]);
%==================================================================
% Circular Correlation using circ_corr= ifft(fft(a).*conj(fft(b))
%==================================================================
fft_code_mtx= fft(b,N)*ones(1,N);
fdout=(ifft(fft_code_mtx.*conj(fft_dopplers)));