低通滤波器实现正确还是错误?

时间:2015-03-16 15:25:40

标签: matlab signal-processing lowpass-filter

我一直在研究测量旋转轴振动的2个传感器信号。由于信号中存在残余噪声。我尝试通过去趋势,零填充和应用低通滤波器来过滤它。下面我在过滤之前和之后附加信号图。过滤后信号有很大的变化,这让我想到如果我真的以正确的方式做到这一点。

enter image description here

我的Matlab代码是

X = xlsread(filename,'F:F');
Y = xlsread(filename,'G:G');

%Calculate frequency axis
fs = 1e6  ; % Sampling frequency (Hz)
NFFT = 2^nextpow2(length(X));  % Zero padding to nearest N power 2
df = fs/NFFT;
dt = 1/df;
%Frequency Axis defintion
f = (-(fs-df)/2:df:(fs-df)/2)';


X(2^ceil(log2(length(X))))=0;
Y(2^ceil(log2(length(Y))))=0;

%calculate time axis
T = (dt:dt:(length(X)*dt))';

subplot(2,2,1)
plot(T,X);
xlabel('Time(s)')
ylabel('X amplitude')
title('X signal before filtering')
subplot(2,2,2)
plot(T,Y);
xlabel('Time(s)')
ylabel('Y amplitude')
title('Y signal before filtering')

 X = detrend(X,0); % Removing DC Offset
 Y = detrend(Y,0); % Removing DC Offset


 % Filter parameters:
 M = length(X);    % signal length
 L = M;          % filter length   
 fc = 2*(38000/60);   % cutoff frequency


 % Design the filter using the window method:
 hsupp = (-(L-1)/2:(L-1)/2);
 hideal = (2*fc/fs)*sinc(2*fc*hsupp/fs);
 h = hamming(L)' .* hideal; % h is our filter



 % Zero pad the signal and impulse response:
 X(2^ceil(log2(M)))=0;
 xzp = X; 
 hzp = [ h zeros(1,NFFT-L) ];

 % Transform the signal and the filter:
 X = fft(xzp);
 H = fft(hzp)';
 X = X .* H;
 X = ifft(X);
 relrmserrX = norm(imag(X))/norm(X); % checked... this for zero
 X = real(X)';

 % Zero pad the signal and impulse response:
 Y(2^ceil(log2(M)))=0;
 xzp = Y; 
 hzp = [ h zeros(1,NFFT-L) ];

 % Transform the signal and the filter:
 Y = fft(xzp);
 H = fft(hzp)';
 Y = Y .* H;
 Y = ifft(Y);
 relrmserrY = norm(imag(Y))/norm(Y); % check... should be zero
 Y = real(Y)';

我绘制了后滤波,如图所示,有明显的偏差。我想只过滤噪音,但信号似乎松动了其他组件,如果这是正确的过滤方式,我有点困惑。 任何建议,提示或想法都会有所帮助。

最后,我想绘制X与Y的关系,以给出轴振动的轨道。另请参阅下面未经过滤和过滤的轨道的另一张照片。正如你在图片中看到的那样,原始轨道的轨道也发生了变化(左图像有很多噪声)。

Unfiltered Orbit and Filtered Orbit

P.S。:我没有DSP工具箱

1 个答案:

答案 0 :(得分:0)

您的FFT和IFFT没有问题。

您可以使用频率非常低的简单正弦波测试代码。最终输出应该(几乎)是相同的正弦波,因为你是低通滤波的。

您已将X(和Y)从0定义为某个值。但是,您已将H从 - (L-1)/ 2定义为某个正值。从数学的角度来看,这很好,但是你只需要一个H的数据.Matlab认为这个时间尺度与X相同,当你将fft加在一起时!

所以,实际上,你已经取得了X H fft(delta(t-d))的fft,其中d是产生的时移。您可以在频域或时域中撤消此时移。