對乙個訊號新增帶限高斯白雜訊 Matlab實現

2021-09-23 01:55:27 字數 2282 閱讀 5395

clear;

clc;

close all;

%% 產生乙個時域訊號

signalinput = cos(2 * pi * 1000 * (1:1:2048).' / 5000);

%% 設計乙個帶通濾波器

rp = 0.1; % passband ripple

rs = 50; % stopband ripple

fs = 2000; % sampling frequency

f = [300 350 450 500]; % cutoff frequencies

a = [0 1 0]; % desired amplitudes

dev = [10^(-rs/20) (10^(rp/20)-1)/(10^(rp/20)+1) 10^(-rs/20)];

[n,fo,ao,w] = firpmord(f,a,dev,fs);

passfreqcoeff = firpm(n,fo,ao,w); % 計算得到fir帶通濾波器的係數

%% 給訊號新增帶限高斯白雜訊

snr = 3;

[signaladdnoise,noisenor2] = signaladdpassbandnoise(signalinput,snr,passfreqcoeff);

%% 訊雜比驗證

esignal = signalinput' * signalinput; % 訊號能量

enoise2 = noisenor2 * noisenor2'; % 雜訊能量

aa = 10 * log10(esignal/enoise2); % 訊雜比驗證

%% 新增雜訊後的訊號

figure

plot(real(signaladdnoise));

grid on

其中signaladdpassbandnoise函式**如下:

function [signaladdnoise,noisenor2] = signaladdpassbandnoise(signalinput,snr,passfreqcoeff)

% %% 輸入引數判斷

% 輸入的序列必須是n×1或者1×n;

[m,n] = size(signalinput);

if (m~=1) && (n~=1)

error('輸入訊號signalinput必須為向量形式!')

elseif m == 1

sendsignalnum = n;

tempsignalinput = signalinput;

else

sendsignalnum = m;

tempsignalinput = signalinput.';

end%% 給訊號新增雜訊

noise = randn(1, 2 * sendsignalnum); % 產生雜訊點數是訊號雜訊的兩倍

noisefilterd = filter(passfreqcoeff, 1, noise);

noiseextra = noisefilterd(sendsignalnum - sendsignalnum/2:sendsignalnum + sendsignalnum/2 - 1);

enoise = noiseextra * noiseextra'; % 計算雜訊的能量

esignal = tempsignalinput * tempsignalinput'; % 計算訊號的能量

noisenorl = noiseextra / sqrt(enoise); % 雜訊歸一化

snr_ratio = 10^( - snr/20);

noisenor2 = noisenorl * snr_ratio * sqrt(esignal); % 得到帶限的高斯白雜訊

signaladdnoise = tempsignalinput + noisenor2;

end

這個函式只能一維時域訊號新增帶限雜訊,如果輸入訊號是乙個矩陣則該函式無法實現。

一維訊號新增高斯白雜訊程式(python)

高斯雜訊 概率密度分布符合高斯分布。高斯白雜訊 它的幅度分布服從高斯分布,而它的功率譜密度又是均勻分布的 即使是一維的高斯白雜訊,其幅度也不會服從高斯分布,而應該服從瑞利分布。二維不相關的復高斯白雜訊包絡服從指數分布 x2分布的自由度為2的特例 n個不相關的復高斯白雜訊序列疊加後的復訊號包絡服從自由...

如何新增乙個提醒

下面的說明適合pluto 和 cosmos,在10a1108mp之後的版本上新增乙個提醒。具體步驟如下 1,在 srv reminder type 中新增type 例如 注意,定義的鬧鐘響應完了,需要執行 srv reminder notify finish 來清除定時器。取消alarm,使用srv...

如何在宣告乙個Vector陣列時對它新增項

在宣告乙個 array 陣列的時候就對它新增項 var list array 1,2,3 在宣告乙個 vector 陣列的時候呢?以下是不同的做法 var list vector.new vector.list2.push 1,2,3 var list vector.vector.1,2,3 var...