随机噪声对 Matlab 中信号滤波的影响

Random Noise Effect On Signal Filtering in Matlab

我正在研究信号处理和过滤。我创建了一个嘈杂的信号,我想使用带通滤波器来获得我想要的频率。 我通过此代码生成噪声信号 "y":

Fs = 16000;                    % Sampling frequency
fNy = Fs / 2;
T = 1/Fs;                     % Sample time
L = 60000;                     % Length of signal
t = (0:L-1)*T;                % Time vector
% Sum of a 50 Hz , 5.8 , 12.6 , 120 Hz sinusoid
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t) +  sin(2*pi*5.8*t) +  sin(2*pi*12.6*t); 
x1 = 15.3 * sin(2*pi*15.5 * t );

a = 5.2;
b = 35.5;
r = a + (b-a).*rand(1,1); 
y = x + x1 + r*randn(size(t));     % Sinusoids plus noise

然后我通过像 Chebyshev 这样的 FIR 算法过滤我的信号以获得 15.5 Hz 的信号。我使用 FDATool 来设计带通滤波器。像这样:

Fs = 16000;  % Sampling Frequency

N             = 16 * 4096;     % Order
Fc1           = 15.48;    % First Cutoff Frequency
Fc2           = 15.52;    % Second Cutoff Frequency
flag          = 'scale';  % Sampling Flag
SidelobeAtten = 100;      % Window Parameter
% Create the window vector for the design algorithm.
win = chebwin(N+1, SidelobeAtten);

% Calculate the coefficients using the FIR1 function.
b  = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag);
Hd = dfilt.dffir(b);

并在 matlab 中使用滤波器函数来获得我想要的信号:

filteredSignal = filter(Hd.Numerator,1,y);
max_amp = max(filteredSignal );

过滤后我得到了信号幅度的最大值。它工作正常。但对我来说有一个大问题。 由于随机噪声,我有不同的过滤信号最大值。 喜欢:10.552 , 10.493 , 10.876 , 10.524 , 10.617

当我像这样降低随机噪声的值时:

r = 0.001;
y = x + x1 + r*randn(size(t));     % Sinusoids plus noise

我得到过滤信号最大值的值,如:

10.541 , 10.541 ,10.541 , 10.541, 10.541

现在我的问题是: 如何减少或降低噪声对过滤后信号的影响?滤波后的信号最大振幅值相同怎么办?

谢谢。

如果你想获得始终相同的振幅,你应该修复你的随机数。每当您 运行 您的代码时,matlab 将生成不同的随机数,并且 SNR 将发生变化。固定随机数的一种方法是初始化随机数生成器。

请尝试以下代码。

Fs = 16000;                    % Sampling frequency
fNy = Fs / 2;
T = 1/Fs;                     % Sample time
L = 60000;                     % Length of signal
t = (0:L-1)*T;                % Time vector
% Sum of a 50 Hz , 5.8 , 12.6 , 120 Hz sinusoid
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t) +  sin(2*pi*5.8*t) +  sin(2*pi*12.6*t); 
x1 = 15.3 * sin(2*pi*15.5 * t );

a = 5.2;
b = 35.5;
rng(0,'twister') 
r = a + (b-a).*rand(1,1); 
rng(0,'twister')
y = x + x1 + r*randn(size(t));     % Sinusoids plus noise

plot(y)

使用这些代码,您可以始终看到相同的信号 y。

Fs = 16000;                    % Sampling frequency
fNy = Fs / 2;
T = 1/Fs;                     % Sample time
L = 200000;                     % Length of signal
t = (0:L-1)*T;                % Time vector
% Sum of a 50 Hz , 5.8 , 12.6 , 120 Hz sinusoid
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t) +  sin(2*pi*5.8*t) +  sin(2*pi*12.6*t); 
x1 = 15.3 * sin(2*pi*15.5 * t );

a = 5.2;
b = 35.5;
r = a + (b-a).*rand(1,1); 
y = x + x1 + r*randn(size(t));     % Sinusoids plus noise

N             = 16 * 4096;     % Order
Fc1           = 15.48;    % First Cutoff Frequency
Fc2           = 15.52;    % Second Cutoff Frequency
flag          = 'scale';  % Sampling Flag
SidelobeAtten = 100;      % Window Parameter
% Create the window vector for the design algorithm.
win = chebwin(N+1, SidelobeAtten);

% Calculate the coefficients using the FIR1 function.
b  = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag);
Hd = dfilt.dffir(b);

filteredSignal = filter(Hd.Numerator,1,y);

Testim=1/15.5;
t0=0;
Ts=1/Fs;

steadyData=filteredSignal(100001:200000);

numAvr=100;

samLen=length(steadyData)/numAvr;

m=[];

for j=0:numAvr-1;

    s0=steadyData(1+j*samLen:j*samLen+samLen);

    Omega=fminbnd('jomega',(2*pi/Testim)*.9,(2*pi/Testim)*1.1, [0,1.0e-30 ], s0,t0,Ts);
    [Amplitude,Theta,RMS]=sinefit2(s0,Omega,t0,Ts);

    freq=Omega/(2*pi);

    if 15.4<=freq & freq<=15.6
        m=[m Amplitude];
    else
    end

end


avrAmp=(1/length(m))*sum(m)

我不知道你到底想做什么。但是,为了减少噪音的影响,我们可以使用最小二乘法,如果我们知道一些信息,比如频率,采样率等。我给你一个example.You可以找到函数'sinefit2.m'在“http://www.mathworks.com/matlabcentral/fileexchange/3730-sinefit”。我认为,在拟合之后,振幅通常会更相似,但并非总是如此。