我正在测试一个 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 功率也可以改善对噪声的估计,这似乎是“低频伪影”造成这种差异的原因。







