2013-07-04 4 views
1

Я использую КИХ-фильтр в MATLAB для фильтрации сигнала. На рисунке ниже, применяя мой фильтр к началу участка создает нижний участок:Фильтр нижних частот в MATLAB - добавляет данные в начало вектора

enter image description here

Эффект это имеет, успешно низкочастотную фильтрацию данных, но переложить все вместе на 500 мс.

Вот процедура я использую фильтр низких частот данные:

% (Start with any vector called 'inputData') 

samplingRate = 1000; 
filterLength = 1000; 
filterCutOff = 90; 

filterType = fir1(filterLength , filterCutOff/(samplingRate/2), 'low'); % define the low pass filter 
inputData = filter(filterType,1,inputData); % filter the data 

Я знаю, что 500 мс сдвиг моих данных относится к половине длины фильтра (1000мс), но почему это случается, и я делаю что-то принципиально неправильное? Я знаю, что мог бы просто удалить первые 500 мс отфильтрованных данных, но я также пропускаю последние 500 мс данных.

Обратите внимание, что для этого примера требуется набор инструментов обработки сигналов .

+3

Если вам не нужна задержка, вам нужно будет использовать фазу задержки фильтра фильтра IIR (filterfilt). Вы не можете получить FIR без задержки. То есть вам нужно будет выбрать фильтр, который лучше всего подходит для вашей ситуации ... – Werner

+1

@Werner, спасибо за это. Если вы добавите это как ответ, я могу принять его как правильно. – CaptainProg

+0

Там вы, добавили книгу, которую я использовал, но, конечно, книг много. – Werner

ответ

0

Если вы не хотите задержки, вам нужно будет использовать фазу задержки нуля фильтра IIR (используйте filtfilt).

У вас не может быть FIR без задержки. То есть, вам нужно будет выбрать фильтр, который лучше всего подходит для вашей ситуации ...

Для получения дополнительной информации о фильтрах, используйте:

Митра, SK Цифровая обработка сигналов: Компьютер-ориентированный подход, 2-й изд , Mcgraw-Hill College

Конечно, вы можете выбрать самое новое издание, если хотите.

0

Если вы хотите, чтобы избежать задержки, вы можете заменить

inputData = filter(filterType,1,inputData); 

с

inputData = conv(filterType, inputData, 'same'); 

Однако ваши сигналы не будут синхронизированы больше, и вы должны принять во внимание задержку, равную на половину длины фильтра в других частях кода.

Смежные вопросы