从频域计算 SNR

信息处理 matlab 信号分析 调制 信噪比
2022-02-13 12:46:10

由于我是信号新手,因此我在频域中收集了一个设备信号,如下所示: 在此处输入图像描述

(PSD-功率谱密度)。所以,我需要在电力线计算中计算这个信号引起的 SNR(信噪比)和 BER(误码率)。所以,我在 Matlab 中编写了这些代码,但我坚持的是计算 SNR 和 BER。

bits=10000; %number of bit
b=randi([0,1],1,bits); % generate random [0,1]
t=0:1/30:1-1/30; % Time period allocated for the signal

%ASK Carrier Signals
carrier_signa_l= sin(2*pi*t);
E1=sum(carrier_signa_l.^2);
carrier_signa_l=carrier_signa_l/sqrt(E1); %unit energy 
carrier_signal_0 =0 * sin(2*pi*t); % zeros for 0 bits in the carrier signal

%MODULATION
ask=[];
for i=1:bits
    if b(i)==1 % If bit = 1
        ask=[ask carrier_signa_l];
    else
        ask=[ask carrier_signal_0];
    end
end
1个回答

如果它是正弦信号,则在对应于音调频率的频谱中(在频率区间中)会有峰值。

这个峰值的幅度与所有其他 bin(它们是噪声)的幅度之和的比率对应于信噪比

但是,当它是一个非正弦信号(如您的图中的那个)时,您必须考虑信号的相关频带而不是单个峰值。您可以通过指定与信号中的主要频率分量相对应的频率箱以及附近箱中的一些泄漏(与带宽相关)来对其进行量化。

请看下面的matlab代码。

N               = 8192; % FFT length
leak            = 50; 
% considering a leakage of signal energy to 50 bins on either side of major freq component

fft_s           = fft(inptSignal,N); % analysing freq spectrum
abs_fft_s       = abs(fft_s);

[~,p]           = max(abs_fft_s(1:N/2));
% Finding the peak in the freq spectrum

sigpos          = [p-leak:p+leak N-p-leak:N-p+leak];
% finding the bins corresponding to the signal around the major peak
% including leakage

sig_pow         = sum(abs_fft_s(sigpos)); % signal power = sum of magnitudes of bins conrresponding to signal
abs_fft_s([sigpos]) = 0; % making all bins corresponding to signal zero:==> what ever that remains is noise 
noise_pow       = sum(abs_fft_s); % sum of rest of componenents == noise power

SNR             = 10*log10(sig_pow/noise_pow);