【问题标题】:Random Noise Effect On Signal Filtering in Matlab随机噪声对 Matlab 中信号滤波的影响
【发布时间】:2015-10-05 17:59:14
【问题描述】:

我正在研究信号处理和过滤。我创建了一个嘈杂的信号,我想使用带通滤波器来获得我想要的频率。 我通过此代码生成噪声信号“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 filter signal-processing


    【解决方案1】:
    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'在“ http://www.mathworks.com/matlabcentral/fileexchange/3730-sinefit"。我认为,在拟合之后,幅度通常会更相似,但并非总是如此。

    【讨论】:

    • 非常感谢您的建议。我以前用过这个样本。最终结果有所改善,但对我来说还不够。现在我正在寻找一些降噪或噪声估计算法。有关于它的任何信息吗?谢谢。
    • 我稍微改变了这个例子。降噪与信息量有关。我对样本数据进行划分以增加幅度信息,分别得到估计的幅度,并对幅度进行平均。要想得到更准确的结果,就需要多采集数据,增加平均次数。
    【解决方案2】:

    如果您想始终获得相同的幅度,您应该修复您的随机数。每当您运行代码时,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 或与滤波信号相关的噪声信号的任何参数?另一方面,我如何从与其他 Sinusoids 信号相关的单个噪声信号(如 snr 或 psnr,...)中计算参数?谢谢。
    • 没有任何“魔术”技巧可以始终将嘈杂的信号精确地转换回原始信号。这些算法非常有效,但是随着噪声幅度相对于信号幅度的增加,您将有损失。如果您希望我在答案中详细说明,请告诉我
    • 非常感谢。我正在寻找降噪算法来提高我的计算精度。你能告诉我我该怎么做吗?滤波信号幅度的准确性非常重要。我从振动系统得到这个信号。你有什么想法?谢谢。
    • 首先,您是否有一些关于噪音来源的信息(测量设备、系统内部的振动)?你能量化这种噪音吗?您会一直使用相同的系统/数据采集流程吗?
    • 振动系统包括一个交流三相电机和一个固定在其转子上的圆盘。该系统以 15.5 Hz(约 950 rpm)运行,它是机械系统,因此机械系统的其他部分会产生一些随机噪声。电机速度由变频器系统控制,因此该变频器有一些噪音。其他放置在振动系统附近的机器,工作在 120rpm、560rmp 等不同的转速下,所以我的振动传感器得到所有这些频率,我必须过滤传感器信号。我使用 16 位数据采集卡,采样率为 80 Kbps。
    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2019-02-11
    • 2011-10-15
    • 2012-12-18
    • 2017-01-20
    • 2016-09-27
    相关资源
    最近更新 更多