随机噪声对 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”。我认为,在拟合之后,振幅通常会更相似,但并非总是如此。
我正在研究信号处理和过滤。我创建了一个嘈杂的信号,我想使用带通滤波器来获得我想要的频率。 我通过此代码生成噪声信号 "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”。我认为,在拟合之后,振幅通常会更相似,但并非总是如此。