我一直在研究测量旋转轴振动的2个传感器信号。由于信号中存在残余噪声。我尝试通过去趋势,零填充和应用低通滤波器来过滤它。下面我在过滤之前和之后附加信号图。过滤后信号有很大的变化,这让我想到如果我真的以正确的方式做到这一点。
我的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的关系,以给出轴振动的轨道。另请参阅下面未经过滤和过滤的轨道的另一张照片。正如你在图片中看到的那样,原始轨道的轨道也发生了变化(左图像有很多噪声)。
P.S。:我没有DSP工具箱
答案 0 :(得分:0)
您的FFT和IFFT没有问题。
您可以使用频率非常低的简单正弦波测试代码。最终输出应该(几乎)是相同的正弦波,因为你是低通滤波的。
您已将X(和Y)从0定义为某个值。但是,您已将H从 - (L-1)/ 2定义为某个正值。从数学的角度来看,这很好,但是你只需要一个H的数据.Matlab认为这个时间尺度与X相同,当你将fft加在一起时!
所以,实际上,你已经取得了X H fft(delta(t-d))的fft,其中d是产生的时移。您可以在频域或时域中撤消此时移。