Реализация полосы пропускания Matlab

У меня есть 2 необработанных сигнала X и Y, измеряющих вибрации вращающегося вала при постоянной скорости. скорость 633,33 Гц. Моя цель состоит в том, чтобы извлечь только определенную частотную составляющую (скажем, 1X или 0,35X) и построить для них орбиты (сигнал X, построенный по отношению к сигналу Y). Я взял необработанный сигнал и применил фильтр нижних частот, используя фильтр Баттерворта. это дало мне ровный сигнал во временной области. Теперь, когда я пытаюсь применить полосовой фильтр Баттерворта между частотами (от 630 Гц до 640 Гц), он не работает должным образом. Я не знаю, правильно ли я делаю. Следующее изображение после применения фильтра нижних частот (баттерворта).

введите здесь описание изображения

Это еще одно после того, как я применил низкочастотный и полосовой фильтры Баттерворта. Исходный сигнал полностью изменен.

введите здесь описание изображенияЯ ожидаю, что фильтр сделает что-то вроде этого, более чистую орбиту для частотной составляющей 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

Я также прилагаю свой файл данных для справки.

Я новичок в мире фильтров и DSP. Может ли кто-нибудь помочь исправить это с предложениями, подсказками или идеями.


person Agni    schedule 17.03.2015    source источник
comment
Вы сделали фильтр с чрезвычайно узкой полосой пропускания, поэтому его импульсная характеристика невероятно длинная. Это то, что вы видите в отфильтрованных компонентах X/Y; это все еще нарастает. Если бы ваш эксперимент длился дольше, вы бы увидели стационарное состояние, которое в основном представляло бы собой две синусоиды.   -  person Oliver Charlesworth    schedule 18.03.2015
comment
Есть ли другой способ разработать абсолютно узкополосный фильтр?   -  person Agni    schedule 18.03.2015
comment
@OliverCharlesworth Я пытался выполнить прореживание, и из-за этого я также теряю разрешение сигнала. Я попытался изучить документацию MATLAB. Это немного сбивает с толку, и я все еще не мог найти подсказок или идей. Не могли бы вы помочь мне, что может быть лучшим способом спроектировать его для абсолютно узких полос? Заранее спасибо.   -  person Agni    schedule 19.03.2015
comment
Как я уже сказал в вашем другом вопросе, ваша частота дискретизации смехотворно высока! Двухмегагерцовая выборка сигналов с частотой 650 Гц просто смешна. Компакт-диски сэмплируют с частотой 44,1 кГц для сигналов с полосой пропускания до 20 кГц. И они обычно считаются приемлемыми для прослушивания Hi-Fi (хотя аудиофилы не согласятся).   -  person Peter K.    schedule 19.03.2015
comment
@peter K. Я пытался уменьшить частоту дискретизации, но теряю разрешение, и, в конце концов, в игру вступает много шума. Также я попробовал подход «децимации», который тоже дал мне неблагоприятные результаты.   -  person Agni    schedule 19.03.2015
comment
Тогда вы делаете что-то еще неправильно... Это действительно не должно иметь никакого эффекта.   -  person Peter K.    schedule 19.03.2015


Ответы (1)


После пропускания сигнала через низкие частоты (т.е. [b2,a2] = oil(6,5*633/(fs/2),'low');) вы можете понизить семпл с 2 МГц до ~ 4 кГц и не увидите больших изменений в результат. Понижающая дискретизация в этом случае не изменит никакого разрешения, которое фильтр еще не уменьшил.

Вы могли бы эл. используйте resample(x,1,500) для понижения частоты сигнала 2 МГц до 4 кГц ПОСЛЕ применения фильтра нижних частот. Тогда у вас не должно возникнуть проблем с узкой полосой пропускания. Обязательно передайте новую частоту дискретизации в фильтр.

Кроме того, если у вас есть полный сигнал, используйте filtfilt вместо filt, чтобы избежать фазовых искажений. В этом случае вы можете немного понизить порядок фильтра, но 4-й порядок для нижних и полосовых частот (после повторной выборки) должен работать нормально.

person Felix Darvas    schedule 07.11.2015