MATLAB SNR问题:我需要帮助使用awgn()函数生成噪声信号,然后使用自定义代码评估该信号的SNR

am46iovg  于 2023-08-06  发布在  Matlab
关注(0)|答案(1)|浏览(164)

我使用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)]
我的想法是,我采样我的噪底不准确,或者我需要考虑带宽,但我不知道如何做到这一点。
任何建议或意见都非常感谢!

tf7tbtn2

tf7tbtn21#

这可能不是你要找的答案,但Matlab确实有一个名为snr的函数。定义在这里:https://au.mathworks.com/help/signal/ref/snr.html。其计算方式是使用信号的平方和根,因此其是使用时域而不是频域来计算的。我不知道如何从星等谱中求出平方和根。
我重写了一点信号生成代码,并保留了绘图,以显示它与awgn(我没有)的信号大致相同。

%%
f = 100;
fs = 1000;
t = 0:1/fs:1-1/fs;
x = cos(2*pi*f*t);

% fft of x 
X = 10*log(abs(fft(x)/length(x)));                              
TF = linspace(0,fs,length(x));

%add noise
%y = awgn(x,10);     
% I don't have 2023, so no awgn, but 10dB is about 3*amplitude
n = rand(size(x));
n = n*2;
n = n-1;
n = n / 3;
y = x+n;

%fft of y
figure;
subplot(2,1,1)
plot(TF,X)
grid
title('magnitude spectrum of "x"')
xlim([0 fs/2])
subplot(2,1,2)
Y = 10*log(abs(fft(y)/length(y)));                
plot(TF,Y)
grid
title('magnitude spectrum of "y"')
xlim([0 fs/2])

字符串
使用时域,您可以执行以下操作:

s = snr(x,y-x) % equivalent to snr(x,n)
% or:
r = mag2db(rssq(x)/rssq(y-x))


输出:

s =

   11.3894

r =

   11.3894


所以,不完全是10,但我只是使用了一个粗略的估计(6dB ~=双振幅,所以 *3约为10 dB)来计算噪声尺度。此外,输出将根据噪声的实际内容而略有变化。
我整理了一下。例如,我首先定义采样率,并使用它来确定矢量长度等。对于1D DFT,您实际上不需要fftshift。这样,频率仓被定义得简单得多。

相关问题