如何改进非相干采样数据的 PSD 中的噪声估计?

信息处理 功率谱密度
2022-02-14 08:25:41

我正在测试一个 ADC,信号发生器的频率无法精确编程,所以我总是进行非相干采样(噪声/相位噪声还可以,但精度低)。当存在非相干采样时,噪声估计与窗口有很大偏差。

为了模拟这个问题,假设模拟信号由 fs 采样,fin = (k+fdelta)/n*fs,其中 k 是正整数,fdelta 是 0 到 1 之间的值,n 是 2^x,x 是一个正整数,随着 fdelta 的变化,信号的估计保持相当准确,但噪声会下降很多,例如:

在此处输入图像描述

这是这个实验 matlab 脚本,其中定义了“噪声估计的优度”和“信号估计的优度”。coswin 函数来自 这里不确定我是否做得正确(也许我使用了错误的窗口?)

clear;
format long

% Number of N
n = 32768;
% bin offset
bin_offset = 0:0.1:1;
% fin bin
korig = 271;
% sampling frequency
fs = 1.5e6;
% amplitude
A = 1;
% standard deviation of noise
std_n = A/2^12;

for i = 1:1:length(bin_offset)

    k=korig+bin_offset(i);    
    % Generate the sinusoid 
    t = 0:1/fs:(n-1)/fs;
    fin = (k/n)*fs;
    y = A*cos(2*pi*fin*t)+std_n*randn(1,length(t));
    [sig_pwr,n_pwr] = get_signal_and_noise(y);
    % goodness of signal amplitude estimated 
    sig_est = (sqrt(sig_pwr)*sqrt(2)/A);
    % goodness of noise std estimated
    nd_est = n_pwr/(std_n^2);

    nn(i) = nd_est;
    ss(i) = sig_est;
end

subplot(2,1,1)
plot(bin_offset,nn)
title('goodness of noise estimation')
subplot(2,1,2)
plot(bin_offset,ss)
title('goodness of amplitude estimation')

function [sig_pwr,n_pwr] = get_signal_and_noise(x)
    L=length(x);
    x = x - mean(x);
    Window = coswin(L,4);
    sigL = 3;
    sigR = 3;
    % coherent gain 
    coherent_gain = sum(Window)/ L;
    % equivalent noise bandwidth  
    crct_eqnbw_win = L*sum(Window.^2)/(sum(Window))^2;
    % windowed data
    [sw_r,sw_c] = size(Window);
    if(sw_r>sw_c)
        Window = Window';
    end
    xw = x.*Window;
    % fft
    fft_ret_dsb = 1/L*fft(xw);
    % psd
    psd_dsb = 1/coherent_gain^2/crct_eqnbw_win*(fft_ret_dsb.*conj(fft_ret_dsb));
    % double sided band to single sided band
    ssb_m = floor(L/2)+1;
    psd_ssb = psd_dsb(1:ssb_m);
    psd_ssb(2:end-1) = 2 * psd_ssb(2:end-1) ;
    % signal power and noise power
    [val,idx]=max(psd_ssb);
    sig_pwr = sum(psd_ssb(idx-sigL:idx+sigR));
    n_pwr = sum(psd_ssb(1:idx-sigL-1)) + sum(psd_ssb(idx+sigR+1:end));
end

2022 年 2 月 21 日更新:

我发现这种差异与 k 以及 sigR 和 sigL 有关。只要我将 sigR 和 sigL 更改为 4 并使 k 变大(> 2000 over n =32768),这足以满足我的测量需求。因此,对于 k<2000,推导出另一个噪声估计程序。但是我仍然会保持这个问题的开放性,以获得一个优雅的解决方案。

2022 年 2 月 24 日更新:

为了更好地解释差异随着 k 的降低而变大,请在 get_signal_and_noise 中插入代码以绘制 PSD。

NBW = 1/L;
freq = 0:NBW:(L-1)*NBW;
freq_ssb = freq(1:ssb_m);
figure
semilogx(freq_ssb,10*log10(psd_ssb))

当k=100时,bin_offset(i)=0.3

在此处输入图像描述

当k=1000时,bin_offset(i)=0.3

在此处输入图像描述

排除附近 DC 附近的 bin 功率也可以改善对噪声的估计,这似乎是“低频伪影”造成这种差异的原因。

1个回答

至于补偿噪声估计窗口的相干和非相干增益,我认为 OP 的以下行应进一步乘以L/fs; 原来是什么:

psd_dsb = 1/coherent_gain^2/crct_eqnbw_win*(fft_ret_dsb.*conj(fft_ret_dsb));

应该:

psd_dsb = 1/coherent_gain^2/crct_eqnbw_win* L/fs * (fft_ret_dsb.*conj(fft_ret_dsb));

这将正确地表示以每 Hz 为基础的功率密度,并解释由 给出的窗口分辨率带宽的否则重复计算crct_eqnbw_win,这是以箱数为单位的分辨率带宽。FFT 的每个 bin 平方一次表示其自身 bin 和相邻 bin 中的功率,因此除以crct_eqnbw_winthen 提供每个 bin 的功率,然后乘以L/fsthen 得到每单位 Hz 的功率。

如果预期测量的噪声高于窗口的旁瓣,则使用的窗口 (Blackman-Nuttall) 是合理的。为了确认(因为我更喜欢使用 Kaiser 窗口),我在下面绘制了 128 长度 Blackman-Nuttall 的内核(傅里叶变换),我们看到相干增益的损失(正如 OP 计算的那样)和出色的旁瓣衰减,可能超过在此窗口的分辨率带宽内测量的本底噪声。此外,OP 通过包括被测音调附近区域上的所有样本,适当地避免了信号功率估计中的任何扇形损失问题。

窗口内核

OP 在评论中进一步澄清,目的是在存在放大的热噪声的情况下测量信号和噪声功率(如果涉及 ADC,我假设热噪声已被放大到高于量化本底噪声) .

问题在于假设窗口的旁瓣低于用于估计噪声的样本中的噪声水平。如果 sigL 和 sigR 是两个低值(这将根据总窗口长度而变化),则信号功率将包含在噪声估计中。

内核与长度

在这里我们看到,对于较短的窗口,相邻的直接旁瓣抑制会增加。一种改进的策略是使用两个不同的区域进行音调估计和噪声估计。对于任何音调,超过 3 个 bin 的剩余功率在所有情况下都可以忽略不计,因此用于信号估计的跨度将是合适的,并且可以最大限度地减少这些样本中的噪声对信号估计的影响。但是对于噪声估计,我建议使用更高的数字,例如甚至,因为被测量的噪声足够高,可以高于超出此范围的窗口的本底噪声。我们失去了基于较少样本比率的估计改进(特别是对于白噪声,噪声估计提高了±3±5±8N其中是使用的样本总数。我会想象在所有情况下,将禁区增加到的损失对于高于 -100 dB/bin 的噪声密度可以忽略不计)。N±8

额外细节:

评论中提到的 OP 继续混淆为什么转移会使这项工作。原因是所选择的噪声水平刚好在窗口的灵敏度阈值上。下图特别显示了样本总数的窗口性能。kN=32768

与此窗口的“本底噪声”相比,问题在于用于测量的噪声水平。OP 使用标准偏差,并建模为高斯白噪声源(每个样本都是独立的,并且由 提供的高斯分布)。此总噪声功率均匀分布在采样频谱中,因此每个 bin 中的噪声(除了与使用的样本数相关的矩形窗口之外没有任何窗口)将以 dB 为单位:分贝。 σ=1/212randn20log10(1/212)10log10(N)=11732768 内核

此窗口的等效噪声带宽(如 OP 已正确计算)为 2 个 bin,这意味着每个 bin 中的测量噪声(没有 OP 提供的缩放以补偿“真实功率”测量)将报告相当于两个 bin 的噪声,或 -114 dB。放大下面的内核,我们看到代表信号的音调旁瓣落在这条线以上的所有区域,因此如果包括这些箱,则会改变噪声测量。此外,即使旁瓣低于该线,它也会非相干地对噪声产生影响并影响结果(例如,旁瓣降低 10 dB 会提高该频段的噪声估计值,即 0.4 dB)。

放大

通过修改,OP 将音调的位置移至较低频率,并开始看到负频率分量和正频率分量的额外相互作用,进一步降低了测量噪声区域的泄漏分量。这种效应限制了测试任何真实音调的低频范围,但在较低噪声条件下改进窗口有助于将其推低,并增加噪声估计的排除区域。k

音调测试

请注意,上面的图是使用零填充 FFT 生成的,该 FFT 用于在频率上插入更多样本,因此显示了当音调相对于 bin 中心移动时(正如 OP 对 fdelta 所做的那样),我们可以在一个图中期待什么。

解决方案是使用 Kaiser 窗口(或 Slepian)来改进算法,因为为此我们可以动态地交换主瓣宽度以获得旁瓣抑制,因此可以为更高的 SNR 条件提供窗口选项,然后将排除区修改为比测量“信号”的包含区域宽得多。正如我们在上面的图中看到的那样,(漂亮的)Blackmann-Nuttall 窗口将应用程序限制在大约 -100 dB/bin 的噪声密度(在窗口等效噪声带宽内),而 OP 使用的噪声水平和窗口将导致 -114 dB/bin 测量。

我在这篇文章中进一步详细说明了对噪声测量加窗的适当补偿(但正如我所提到的,看起来 OP 正在正确地执行此操作)。