使用 MATLAB `xcorr()` 查找隐藏在噪声后面的信号

信息处理 matlab fft 噪音 互相关 去噪
2021-12-20 08:20:01

我正在尝试开发一些代码来在我拥有的数据集中找到瞬态信号。然而,在我到达那里之前,我正在尝试使用模拟数据编写代码。

我首先创建一个具有指定频率的信号,然后向其添加白噪声。

然后,我遍历一个循环,在该循环中以增量频率创建参考信号。我采用两个信号的 FFT 和 I xcorr 结果。

使用这种方法,当我使用大于 -15 dB 的 SnR 比时,我会得到下降结果,但在那之后我的结果就不好了。无论如何我可以优化它以找到隐藏比 -15 dB SnR 更深的信号吗?

我的代码:

t = linspace(0,16*pi,1000);
y = cos(2*t);
z = awgn(y,-10);
fftz = fft(z);

subplot(2,1,1);
plot(t,z)
subplot(2,1,2);
plot(t,y)

freq = linspace(0.1,10,500);

for i=1:500
    reference_signal = cos(freq(i)*t);
    fftr = fft(reference_signal);
    Q(i) = max(abs(xcorr(fftz,fftr)));
end

subplot(3,1,1);
plot(t,y)
subplot(3,1,2);
plot(t,z)
subplot(3,1,3);
plot(freq,Q)

输出

在此处输入图像描述

2个回答

你基本上是在做一组假设来使用匹配滤波器找到你的信号。

尽管您使用了稍微不同的方法。

首先,您应该将信号留在时域并在频域计算互相关或它们的乘法。然而,由于您的信号没有未知的相位(或延迟)乘法(它涵盖了零时的互相关)-> 这相当于您在频域中所做的。

由于您使用的是 AWGN,因此性能取决于有效 SNR。
有效 SNR 是信号能量、噪声方差和样本数量的函数。

如果您设置信号和噪声的方差,只需使用更多样本(信号的 -> 等效的更快的采样率)。

如果您向它提供 100k 数据点(我已经检查过),您的方法即使在 -30 [dB] SNR 下也确实有效。

我也看不出使用第一个而不是第二个的意义:

% 你的方式
Q1(i) = max(abs(xcorr(fftz,fftr)));
% 更简单,结果非常相似
Q2(i) = max(abs(xcorr(reference_signal,z)));

此外,第二个几乎是傅立叶变换所做的,那么为什么不只计算PSD呢?(这也给出了相当相似的结果,并且是非常常见的技术)

不过,我不知道该向您推荐什么以获得更好的结果。如果我有什么想法我会回来的。