在Matlab中对信号滤波产生的随机噪声效应
我对信号处理和滤波进行了研究。我创建了一个嘈杂的信号,我想用带通滤波器来获得我想要的频率。 我产生噪声信号“Y”这段代码:在Matlab中对信号滤波产生的随机噪声效应
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
和过滤我的信号通过像切比雪夫FIR算法得到15.5赫兹信号。我使用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
我得到filterd信号最大的这个值,如:
10.541 , 10.541 ,10.541 , 10.541, 10.541
,现在我的问题是: 如何减少或减少对滤波信号的噪声影响?我应该怎么做才能在滤波后得到相同的最大信号幅值?
谢谢。
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)
我不知道你想要做什么,确切地说。但是,为了减少噪声影响,我们可以使用最小二乘法,如果我们知道一些信息,例如频率,采样率等,我给你举个例子。你可以在“ http://www.mathworks.com/matlabcentral/fileexchange/3730-sinefit“。我认为,在拟合之后,振幅通常会更相似,但并非总是如此。
如果你想获得始终相同的幅度,你应该修复你的随机数。每当你运行你的代码时,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。
感谢您的重播,我想模拟嘈杂系统的真实情况并处理一些频率行为。 (如相位,幅度,...) 其实我的信号的SNR每次都会改变。我正在寻找一种解决方案来减少滤波信号的随机噪声影响。是否有任何想法获得信噪比或与滤波信号有关的任何噪声信号参数?另一方面,我如何计算与其他正弦信号相关的单个噪声信号(如snr或psnr,...)的参数? 谢谢。 –
没有什么'魔术'技巧会总是将嘈杂的信号转化为原始信号。算法非常高效,但是,随着噪声的幅度相对于信号的幅度增加,您将会有损失。告诉我,如果你想让我更详细地解答 – BillBokeey
非常感谢。我正在寻找降噪算法来提高我的计算精度。你能告诉我该怎么办?滤波信号的幅度精度非常重要。我从振动系统得到这个信号。你有什么想法?谢谢。 –
非常感谢您的建议。我之前使用这个样本。最终结果稍微改善一点,但这对我来说还不够。现在我正在寻找一些降噪或噪声估算算法。有没有关于它的任何信息?谢谢。 –
我改了一点例子。降低噪音将与信息量有关。为了增加幅度信息,我分割了样本数据,分别得到了估计的幅度和平均幅度。如果你想得到更准确的结果,你需要更多地获取数据,并增加平均数。 – KKS