2015-11-14 55 views
0

我想計算噪聲信號和濾波信號的SNR。我使用了下面的代碼,但我不確定結果是否正確。有人能幫助我嗎?如何在Matlab中計算信號的信噪比?

%generate the noisy signal which will be filtered 
x= cos(2*pi*12*[0:0.001:1.23]); 
x(end) = []; 
[b,a] = butter(2,[0.6 0.7],'bandpass'); 
filtered_noise = filter(b,a,randn(1, length(x)*2)); 
y = (x + 0.5*filtered_noise(500:500+length(x)-1))/length(x)*2; 

%Use matlabs built-in buttord function to get the optimum order to meet a  
specification 
[N,Wn] = buttord(0.1, 0.5, 5, 40) 

%use the N and Wn values obtained above to design the filter in the usual 
way 
[b,a] = butter(N, Wn, 'low'); 

%filter the signal and plot the ouput of the filter 
Y_filtered = filter(b,a,y); 

%calculation of snr before filtering 
snr_before = mean(x.^2)/mean(filtered_noise.^2); 
snr_before_db = 10 * log10(snr_before) % in dB 

%calculation of snr after filtering 
residual_noise = x - Y_filtered; 
snr_after = mean(x.^2)/mean(residual_noise.^2); 
snr_after_db = 10 * log10(snr_after) 

結果,我得到的是:

snr_before_db = 
     6.8725 
snr_after_db = 
     0.0132 

回答

0

我不認爲濾波前後計算PSNR的正確途徑。另外,您計算PSNR的方式也不正確。只有在過濾後才能計算PSNR。試試這個

peaksnr = psnr(X,Y_filtered) 

MSE = (1/length(X))*sum((X-Y_filtered).^2); 
peaksnr = 10*log10(max(X(:))^2/MSE); 
+0

好吧。那麼,如何在濾波之前知道SNR的值?以便我可以比較不同類型的過濾器之間的結果。 – Alisa