Широко распространено мнение, что подлинное обучение основано на опыте. Когда вы разрабатываете приложения для обработки сигналов, даже с помощью таких мощных программных инструментов, как Matlab, иногда возникают неожиданные эффекты, и мы просто можем увидеть это на практике. Поэтому хорошо сказано, что «бесы кроются в деталях».

В этом эссе я собираюсь представить нежелательный эффект, который имеет место, когда требуется передискретизировать сигнал, и как выполнить решение с помощью Matlab. Кроме того, для иллюстрации проблемы показаны сценарии Matlab с рисунками и два альтернативных решения, которые все еще обсуждаются.

Во-первых, в обработке сигналов хорошо известна необходимость изменения частоты дискретизации сигнала. В качестве примера был извлечен импульс из сигнала ЭКГ sele0704 из QTDatabase в Physionet Database. Согласно информации из базы данных, сигнал был дискретизирован с частотой 250 Гц. Однако в приложении, в котором я работаю, необходимо изменить частоту дискретизации сигнала ЭКГ на 360 Гц, чтобы адаптировать сигнал к шуму, дискретизируемому с той же частотой. Вначале может показаться, что это простая и стандартная операция, реализованная с помощью функции resample Matlab, но мы понимаем, насколько сложным может оказаться этот опыт. На рисунке 1 показаны извлеченные сердечные сокращения ЭКГ и версия с повторной выборкой после применения функции resample.

Мы можем видеть, насколько похожи эти два сигнала, даже если передискретизированная версия больше оригинала. Тем не менее, я хочу выделить замечательную разницу на краях сигналов. Ярко выражено, насколько этот результат далек от ожидаемого. Как это произошло? Эти колебания приписываются операции фильтрации внутри функции resample, которая предполагает, что входной сигнал равен нулю до и после получения отсчетов. Следовательно, большие отклонения от нуля в конечной точке сигнала, как в нашем изображенном примере, создают такие краевые эффекты. У этой проблемы должно быть множество решений, я покажу две альтернативы.

Во-первых, если проблема возникает из-за отсутствия нуля в конечной точке последовательностей, давайте предварительно обработаем сигнал для его соответствия и реализации этой функции. Этот метод называется нормализацией среднего. Это означает вычитание среднего значения последовательности, и, следовательно, сигнал будет иметь нулевое среднее значение перед операцией передискретизации. Это широко распространенная процедура нормализации. После операции ресэмплирования краевой эффект будет уменьшен. На рисунке 2 мы можем видеть результат повторной дискретизации сигнала до 360 Гц с незначительным краевым эффектом.

С другой стороны, в зависимости от приложения этот результат может не подходить. Краевой эффект все еще присутствует, поскольку мы можем видеть отклоненную выборку в конечной точке повторно дискретизированной последовательности. Более того, иногда нормализация нулевого среднего не очень хорошо воспринимается и требуется для поддержания исходного диапазона.

Во-вторых, если мы хотим гарантировать отсутствие краевого эффекта, я предлагаю метод работы с переворотом и сдвигом для последовательности перед применением функции повторной выборки с последующим вырезанием центральной последовательности. Таким образом, операции переворота и сдвига увеличивают сигнал в три раза, обеспечивая непрерывный переход на границах. Следовательно, краевые эффекты появятся в областях избыточности, которые можно будет легко устранить с помощью операции резки. Кроме того, чтобы правильно нарезать центрированный сигнал, важно определить длину. Функция resample заявляет, что окончательная длина сигнала равна выражению: L = ceil (length (ecgSignal) * newFs / Fs); Теперь заметно, насколько эффективно были устранены граничные колебания, и ритм ЭКГ готов к использованию на дальнейших этапах процесса. Эти шаги показаны на рисунке 3.

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

Во-первых, прежде чем изменять частоту дискретизации сигнала с помощью известных инструментов на Matlab, необходимо проверить диапазон амплитуд и близость его конечных точек к нулевым значениям.

Во-вторых, если это условие не выполняется, необходимо выделить среднее значение сигнала или увеличить его продолжительность на основе операции переворота и сдвига перед повторной дискретизацией.

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