带通滤波器实现matlab

5cnsuln7  于 2023-03-13  发布在  Matlab
关注(0)|答案(1)|浏览(318)

我有两个原始信号X和Y,测量恒定速度633.33 Hz下旋转轴的振动。我的目标是仅提取特定频率分量(比如1X或.35X)并绘制轨道(X信号对Y信号)。我取原始信号,用巴特沃思滤波器进行低通滤波。它给了我时域中的平滑信号。现在当我'我尝试在频率(630 Hz到640 Hz)之间应用巴特沃思带通滤波器,但它不能正常工作。我不知道我是否做对了。下图是应用低通滤波器(巴特沃斯)后的图像。

这是另一个后,我应用巴特沃思低通和带通滤波器。有完全改变了原来的信号。
我希望滤波器能做类似这样的事情,对于1X频率分量,轨道更干净。

我的MATLAB代码如下。

L = length(X); % length of signal
  fs= 2e6; % sampling frequency
  df = fs/L; % Frequency window
  dt = 1/df; % time window
  %calculate time axis
  T = (0:dt:(L-1)*dt)';
  subplot(3,2,1);
  plot(T,X);
  title('before filtering X signal')
  subplot (3,2,2);
  plot(T,Y);
  title('before filtering Y signal')
  subplot(3,2,5);
  plot(X,Y);
  title('Orbits before filtering')
  X = detrend(X,0); % Removing DC Offset
  Y = detrend(Y,0); % Removing DC Offset

  % Butterworth low pass filter to remove high frequency components
  [b2,a2] = butter(6,5*633/(fs/2),'low');
  dataInX = X; 
  X = filter(b2,a2,dataInX); %filter command filters 
  dataInY = Y;
  Y = filter(b2,a2,dataInY);

  % butter worth band pass to only plot for 1X frequency component
  [b1,a1] = butter(1,[633/(fs/2) 640/(fs/2)],'bandpass');
  dataInX = X; 
  X = filter(b1,a1,dataInX); %filter command filters 
  dataInY = Y;
  Y = filter(b1,a1,dataInY);

  subplot(3, 2 ,3);
  plot(T,X);
  axis tight
  title('X signal after filtering')
  subplot(3,2,4);
  plot(T,Y);
  axis tight
  title('Y signal after filtering')
  subplot(3,2,6);
  plot(X,Y);
  title('Orbit after filtering')
  axis tight

我还附上了我的data file以供参考。
我是过滤器和DSP的新手。有人能提供建议或提示或想法来解决这个问题吗?

b5lpy0ml

b5lpy0ml1#

在低通信号之后(即[b2,a2] = butter(6.5 *633/(fs/2),“低”);)你可以从2 MHz下采样到~ 4 kHz,结果不会有太大的变化。在这种情况下,下采样不会改变滤波器尚未降低的任何分辨率。
在应用低通滤波器后,你可以使用resample(x,1,500)将2 MHz信号降采样到4 kHz。这样你的窄带通就不会有问题了。确保将新的采样率传递到滤波器上。
此外,如果您有完整的信号可用,请使用filtfilt而不是filt来避免相位失真。在这种情况下,您可以稍微降低滤波器阶数,但低通和带通(重采样后)的4阶应该可以正常工作。

相关问题