我使用awgn()生成一个具有给定SNR的信号'x',在本例中为10 [第19行]。
我试图用我自己的代码准确地评估它创建的信号的SNR,但我从噪声基底中计算出的信号增益比应该的要多[第44行]。
f = 1000;
t = 0:.0001:1;
x = cos(2*pi*f*t);
len = length(x);
fs = (0:len-1)/t;
plot(t,x)
xlim([0 .01])
title('Signal "x"')
%fft of x
X = fftshift(abs(fft(x)));
TF = (-len/2:len/2-1)*fs/len;
plot(TF,X)
title('FFT of "x"')
%add noise
y = awgn(x,10);
plot(t,y)
xlim([0 .01])
title('Signal "y"')
%fft of y
Y = 10*log(abs(fftshift(fft(y)/length(y))));
plot(TF,Y)
grid
title('FFT of "y"')
xlim([500 1500])
%Finding power of signal
MinH = max(Y) -10;
[pks,locs] = findpeaks(Y,"MinPeakHeight",MinH)
Peaks = tf(locs);
fcSig1 = 0.5*(Peaks(1,1) + Peaks(1,2))
S = (pks(1,1)+pks(1,2))/2
%Finding power of white noise
[negpks,neglocs] = findpeaks(-(abs(Y)));
avgN = sum(negpks)/length(negpks);
N = avgN
SNR = S-N %in dB
字符串
我尝试对信号的平均功率、噪声基底的平均功率进行采样,将这些功率转换为dB单位,然后从信号dBm中减去噪声dBm。
我的结果在这里:x1c 0d1x如果无法打开:[S =-7.1313,N =-55.5702,SNR = 48.4389(比我的输入10高38 dB)]
我的想法是,我采样我的噪底不准确,或者我需要考虑带宽,但我不知道如何做到这一点。
任何建议或意见都非常感谢!
1条答案
按热度按时间tf7tbtn21#
这可能不是你要找的答案,但Matlab确实有一个名为
snr
的函数。定义在这里:https://au.mathworks.com/help/signal/ref/snr.html。其计算方式是使用信号的平方和根,因此其是使用时域而不是频域来计算的。我不知道如何从星等谱中求出平方和根。我重写了一点信号生成代码,并保留了绘图,以显示它与
awgn
(我没有)的信号大致相同。字符串
使用时域,您可以执行以下操作:
型
输出:
型
所以,不完全是10,但我只是使用了一个粗略的估计(6dB ~=双振幅,所以 *3约为10 dB)来计算噪声尺度。此外,输出将根据噪声的实际内容而略有变化。
我整理了一下。例如,我首先定义采样率,并使用它来确定矢量长度等。对于1D DFT,您实际上不需要
fftshift
。这样,频率仓被定义得简单得多。