Matlab中信号滤波的随机噪声效应

时间:2015-10-05 17:59:14

标签: matlab filter signal-processing

我正在进行信号处理和过滤。我创建一个嘈杂的信号,我想使用带通滤波器来获得我想要的频率。 我会产生噪音信号" 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 );

并且在滤波之后我获得最大的信号幅度。它工作正常。但对我来说有一个大问题。 由于随机噪声,我有不同的滤波信号max值。  喜欢: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

现在我的问题是: 如何降低或降低滤波信号的噪声影响?我该怎么做才能在滤波后得到相同的信号最大幅度值?

感谢。

2 个答案:

答案 0 :(得分:0)

如果你想获得始终相同的幅度,你应该修正你的随机数。无论何时运行代码,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。

答案 1 :(得分:0)

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)

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