Основы цифровой обработки сигналов: Анализ ЭКГ в MATLAB, Дискретные периодические сигналы, Синусоидальный сигнал как базис
Рассмотрены 3 темы по основам цифровой обработки сигналов: анализ ЭКГ в MATLAB, дискретные периодические сигналы, синусоидальный сигнал как базис.
В данном посте освещены 3 темы по основам цифровой обработки сигналов:
Анализ ЭКГ в MATLAB.
В этой публикации мы попробуем импортировать и обработать сигнал электрокардиограммы в MATLAB. Давайте посмотрим какие задачи лежат перед нами. Данные электрокардиограммы записаны в файле Excel, поэтому первая задача импортировать данные из файла Excel в рабочее пространство MATLAB. Следующая задача – предобработка загруженных данных. Нам важно проанализировать форму электрокардиограммы, понять расстояние между отдельными зубцами, оценить их высоту, но тот вид сигнала, который нам достался не совсем будет позволять это сделать.
Давайте перейдём в MATLAB и посмотрим, что же там к чему. Исходные данные, то есть значение кардиограммы, хранятся в Excel файле, мы можем открыть его вне MATLAB, посмотреть то, что у него первый столбец это значение времени, второй столбец – это непосредственно значение напряжения.
Сейчас попробуем его импортировать. Двойным кликом можем открыть этот файл в MATLAB, и открывается инструмент Import Tool, который позволяет нам численные данные из Excel файла импортировать в виде векторов, столбцов в MATLAB.
Мы выбираем то, что мы импортируем Column vectors, то есть вектора-столбцы, нажимаем кнопку Import selection и мы видим то, что в рабочем пространстве появились две новые переменные t и sig, то есть первый и второй столбец соответственно.
Давайте снова откроем инструмент Signal Analyzer для того, чтобы визуализировать и обработать этот сигнал. Мы точно также загружаем наш сигнал sig для визуализации его во временной области, настраиваем его цвет и зададим ему временные значения.
Мы видим то, что наш сигнал немножко не стабилен, скажем так, плавает во времени, потому что у него есть постоянная составляющая, и она будет мешать нам оценить высоты отдельных зубцов. Можем наблюдать её, сгладив ее сигнал при помощи инструмента Smooth. Мы выберем период усреднения 10 секунд, и вот так вот выглядит форма нашей постоянной составляющей.
Вернём наш сигнал в исходный вид, нажав кнопку Undo Preprocessing. Создадим копию нашего сигнала, над которым мы будем работать, опять-таки выбрав Duplicate. Оставим название Sig_copy, только поменяем цвет на какой-то более контрастный. Теперь мы можем воспользоваться инструментом Highpass Filter или фильтр верхних частот для того, чтобы пропустить спектральные компоненты выше 5 Гц. Это уберёт постоянную составляющую.
Мы можем сравнить результаты операции во временной оси, можем наблюдать то, что постоянная составляющих действительно пропала. Теперь мы можем приблизить определенную область нашего сигнала, воспользоваться инструментом Panner. Он весьма удобен для того, чтобы перемещаться во временной оси.
Приблизив, мы достаточно хорошо наблюдаем то, что у нас есть некое высокочастотной дрожание нашего сигнала, поэтому воспользоваться инструментом Lowpass, то есть фильтр нижних частот. Подавим все частоты выше 10 Гц, тем самым сгладив наш сигнал.
Вот мы видим то, что результат теперь гораздо более сглаженный. На нём гораздо проще оценить расстояние между отдельными зубцами. Можем экспортировать его обратно в рабочее пространство MATLAB или в MAT-file. Таким образом мы успешно импортировали и обработали сигнал электрокардиограммы.
Давайте поговорим ещё об одной удобной особенности современного MATLAB, а именно о живых скриптах. Все команды, которые мы вводили, мы специально для удобства сохранили в отдельных файлах. Файлы с расширением *.mlx это так называемые живые скрипты или Life Script в MATLAB.
Здесь можно вносить текстовые комментарии, результаты выполнения команд отображаются в отдельном поле, и наборы команд можно выполнять по секциям. К примеру, в данном скрипте в отдельной секции выделено создание синусоиды, 3х синусоид (ля, до#, ми) и аккорда ля-мажор. Конечно же мы подготовили отдельный скрипт и для чтения и анализа сигнала ЭКГ из файла Excel. Ссылки на скачивание обоих этих скриптов и Excel файла будут доступны в разделе файлы в нижней части данной публикации. Знакомиться с MATLAB мы пока что закончили, и следующая публикация у нас будет посвящён более подробному рассмотрению дискретных сигналов.
Ссылка для скачивания скриптов.
Дискретные периодические сигналы
В данной публикации мы более подробно поговорим о дискретных сигналах и рассмотрим дискретные периодические сигналы. Давайте напомним для начала себе что же такое сигнал и как мы можем его описывать. Как мы говорили в предыдущих публикациях, сигнал – это изменение физической величины во времени или пространстве. К примеру, это может быть изменение одномерного сигнала в зависимости от времени или же, если мы рассматриваем цифровое изображение, это может быть изменение яркости пикселей в зависимости от его положения в пространстве. Но с точки зрения математики сигнал – эта функция одной или нескольких независимых переменных. В нашем случае независимыми переменными являются время и положение в пространстве, а зависимыми переменными могут быть значение нашего сигнала х(t) или яркости пикселей на цифровом изображении.
Теперь давайте вспомним что же такое дискретный сигнал и как мы получаем его из аналогового. Непрерывный аналоговый сигнал определён на всём промежутке времени, то есть мы в любой момент времени T можем узнать значение сигнала x. Если мы возьмём эти значения с периодом дискретизации Т, то мы получаем дискретный сигнал, значение которого определены только в конкретные моменты времени. Дискретный сигнал мы теперь записываем как x(n), n – это номера отчётов дискретной последовательности.
Если взглянуть на процесс дискретизации с точки зрения математики, то выходная дискретная последовательность x(n) формируется,когда мы подставляем в нашу функцию x(t) значение времени t=nT, где n – это номер дискретного отсчёта, T – период дискретизации.
Теперь давайте поговорим о периодических сигналах. Периодическими сигналами мы называем те, форма которых повторяется во времени. Повторяться во времени может как форма непрерывных сигналов, так и форма дискретных сигналов. Периодом сигнала мы называем интервал повторения. К примеру, у дискретного сигнала y(n) форма повторяется каждые 4, 8, 12 и так далее отчётов. Для непрерывного сигнала z(t) форма повторяется каждые 2, 4, 6 и так далее секунд.
Фундаментальным или основным периодом сигнала называется наименьший интервал повторения. То есть для нашего дискретного сигнала y(n) – это четыре отчёта, а для нашего непрерывного сигнала – это 2 секунды. От понятия фундаментального периода мы можем перейти к понятию фундаментальные частоты.
Фундаментальная или основная частота, также именуемая первой гармоникой – это количество основных периодов сигнала, приходящихся на единицу времени. Частота измеряется в Герцах, то есть в количестве периодов, приходящихся на одну секунду, и фактически является обратной величиной основного периода. Если мы рассмотрим наш непрерывный сигнал z(t), его основной период равен 2 секундам, а это значит, что на 1 секунду приходится ровно половина его периода.
Но если с непрерывным сигналом всё более-менее понятно, то есть мы можем взглянуть на него на временной оси, оценить величину основного периода и подсчитать значение основной частоты, то с дискретным сигналом всё не так просто.
Нам доступны значения отсчетов, мы знаем их номера в последовательности, но мы не знаем, как они соотносятся с его фундаментальной частотой, и как они соотносятся с частотой дискретизации. Ну давайте в этом попробуем разобраться на примере.
В прошлых публикациях мы формировали музыкальные тона или ноты при помощи дискретных синусоид, когда мы прослушивали наши дискретные синусоиды, мы слышали именно первые гармоники наших сигналов. Но теперь нам интересно узнать, сможем ли мы услышать первую гармонику сигнала, не похожего по форме на синусоиду. К примеру, возьмём дискретный сигнал, который мы использовали ранее.
Он имеет период в 4 отчёта, где 2 первых отчёта в периоде имеют большую амплитуду, а 2 последних отчёта имеют малую амплитуду. Нашей задачей в данном примере будет при помощи такого сигнала услышать ноту ля первой октавы, то есть частоту 440 Гц. Для того, чтобы это сделать, нам обязательно надо понять как основная частота соотносится с частотой дискретизации сигнала. Для этого давайте перенесём наш сигнал на временную ось.
Основной период данного сигнала рассчитывается так же, как для непрерывного сигнала, то есть это обратная величина его фундаментальной частоты, в нашем случае 1/440. Но мы также видим то, что период дискретизации нашего сигнала Δt в 4 раза меньше, чем основной период, так как на основной период приходится ровно 4 отсчёта.
Выразим частоту дискретизации через период дискретизации. Частотой дискретизации можно записать 1/Δt, что в свою очередь равно 4/T0, то есть в нашем случае частота дискретизации должна быть в 4 раза больше, чем наша фундаментальная частота ноты ля первой октавы.
Перейдём в MATLAB и попробуем проверить наши теоретические выкладки на практике. В первую очередь давайте создадим наш дискретный прямоугольный сигнал. Мы задаём определённые константы, нашу фундаментальную частоту, частоту дискретизации в 4 раза больше, рассчитываем период дискретизации и формируем временную сетку. Затем мы создаём сам сигнал. Сначала мы задаем 1 период сигналом (это 4 отчёта 1100) и повторяем его командой repmat. Обратите внимание, что данный момент мы не формируем наш сигнал из вектора T, они независимы, мы только совмещаем их при визуализации и при прослушивании.
В выбранных пределах по оси X на графике мы наблюдаем 4 периода нашего сигнала. Давайте послушаем его и попробуем понять , похож ли он на ля первой октавы 440 Гц. Мы можем сравнить его с дискретной синусоидой, которую мы формируем по принципу из предыдущих публикаций.
Мы слышим то, что это действительно два одинаковых тона, и также прошу обратить внимание то, что дискретную синусоиду мы сформировали из вектора Т, то есть она зависит от вектора Т. Давайте у нашего прямоугольного сигнала попробуем поменять параметры частоты дискретизации, сделаем его в 2 раза больше и послушаем, что получилось.
Тон стал гораздо выше, это явно ля второй октавы. Периодов в данный отрезок времени помещается теперь тоже в два раза больше – 8. Давайте проверим, если мы поставим в дискретной синусоиде значение f0=880, то мы услышим такой же тон. Или мы можем сделать частоту дискретизации меньше, таким образом чтобы в наш отрезок помещалось лишь 3 периода. Это соответствует тону в 330 Гц. Почему мы можем менять частоту дискретизации и слышать разные тона. Давайте я поподробнее об этом расскажу.
Если мы рассмотрим наши манипуляции над дискретным сигналом как манипуляции над аналоговым сигналом, а после этого дискретизацию аналогового сигнала, то вот к чему мы приходим: когда мы увеличиваем частоту дискретизации, то мы фактически берём дискретные отсчеты более быстрого аналогового сигнала. Или кладём отсчёты того же дискретного сигнала на другую временную сетку. К примеру, наш дискретный сигнал с периодом дискретизации Δt можно представить как оцифрованное значение аналогового сигнала с периодом T0.
Если теперь те же самые отсчеты сигнала мы положим на более плотную временную сетку с меньшим периодом Δt, это фактически тоже самое, как если бы мы оцифровали более быстрый аналоговый сигнал с меньшим периодом T0.
В качестве эталонного аналогового сигнала мы здесь представляли синусоиду. А почему мы так часто используем синусоиду, когда говорим о цифровой обработки сигналов – об этом в следующей публикации.
Синусоидальный сигнал как базис
В этой публикации мы поговорим почему синусоидальный сигнал является фундаментальным для описания и обработки сигналов. Во-первых, синусоидальные сигналы встречаются в природе. Если мы говорим о световых волнах или электромагнитных колебаниях, все они имеют форму синуса. Колебания маятников или грузов, подвешенных на пружинах, также синусоидальны по своей природе. Ну и конечно вращательное движение. Если мы рассмотрим вращения вектора, то проекции его на ось X или Y представляет собой синусоиду. Многие электрические синусообразные сигналы генерируются именно вращательным движением. Также у синусообразного сигнала есть удобное понятие частоты. Мы говорим о частоте звуковых колебаний, мы говорим о частоте световых колебаний, мы говорим о частоте появления того или иного явления. Ну и синусоида является базисом, то есть фактически любой сигнал можно представить суммой синусоид.
Для того чтобы понять как сложные сигналы могут быть представлены простыми, давайте рассмотрим подобную аналогию. Конструктор, есть набор стандартных деталей, из которых можно собрать весьма сложное изделие. Или же мы можем представить себе сложную оркестровую композицию, которую можно разделить на отдельные партии. Простые синусоидальные сигналы мы можем рассматривать как строительные блоки, из которых мы строим сложный сигнал. Объединение простых сигналов в сложный мы также можем назвать композицией. Но гораздо важнее в этом принципе наверное даже декомпозиция, то есть возможность разложения сложного сигнала на элементарные.
Рассмотрим пример разложения сложного сигнала на простые с математической точки зрения. Любой сложный сигнал можно представить как сумму или суперпозицию простых сигналов единичной амплитуды помноженный на определенные весовые коэффициенты. Сумма взвешенных сигналов разной амплитуды и формирует исходный сложный сигнал. Простые сигналы единичной амплитуды мы именуем базисом. Если мы рассматриваем различные сложные сигналы в рамках одного базиса, отличаются они друг от друга будут только набором весовых коэффициентов. Для описания разнообразных сложных сигналов очень важно выбрать правильный базис, чтобы элементарные сигналы в нём явно отличались друг от друга.
Процессы получения весовых коэффициентов из отсчетов сигнала мы называем преобразованием, и, по факту, представить сигнал мы можем как в виде его отсчётов, так и в виде его весовых коэффициентов в выбранном базисе.
Преобразование и работа с весовыми коэффициентами используется во многих задачах цифровой обработки сигналов таких как фильтрация, компрессия, эквализация и так далее. Для разных задач также используются разные типы преобразований. Это могут быть преобразование Фурье, Вейвлет-преобразование, дискретно-косинусное преобразование.
Давайте на простом примере посмотрим, как из базовых сигналов с различными весовыми коэффициентами мы можем сформировать сложный сигнал. Перейдем в MATLAB. Мы попробуем сформировать прямоугольный сигнал из суммы синусоид. В нашем случае мы будем добавлять гармоники, то есть сигналы, частота которых больше, чем частота исходного сигнала в целое число раз. К первой гармонике мы добавляем третью. В данном случае это синусоидальный сигнал с частотой в 3 раза выше, но с амплитудой в три раза меньше, чем у первой гармоники.
На данном графике мы увидим оба сигнала и их сумму жирной линией. Мы видим то, что данные гармоники подавляют друг друга и усиливают в определённых местах. Если затем мы добавим 5-ю, 7-ю и 9-ю гармоники и отразим на графике также их суммы, мы можем обратить внимание то, что сумма уже начинает напоминать прямоугольный сигнал.
И далее, добавляя ещё больше гармоник, можем добиться формы сигнала, очень близкой к прямоугольной. Подобным образом, изменяя весовые коэффициенты и сдвигая элементарные сигналы во времени, мы можем сформировать любой сложный сигнал. На представлении сложных сигналов в виде набора весовых коэффициентов основывается спектральный анализ. Ему будет посвящена отдельная публикация. В следующей публикации мы поговорим об ограничениях при дискретизации аналогового сигнала.
Комментарии
Добрый день. У меня вопрос, после movmean и filloutliers, исходный сигнал sig кардиограммы модифицируется. Каким образом адаптировать переменную t под модифицированный sig, чтобы plot модифицированного сигнала был адекватным? Спасибо.
Здравствуйте. Я так понял, вы используете встроенные функции MATLAB, а не Signal Analyzer? В таком случае, вы можете здесь привести код. Функции movmean и filloutliers не должны изменять число элементов входного вектора, и ошибок при применении plot не возникает. Но, возможно, вы что-то другое имеете в виду под "адекватностью" plot?