• Регистрация
Marat
Marat +208.00
н/д

Основы цифровой обработки сигналов: Знакомство с MATLAB, Создаем аккорд в MATLAB; Выделяем тон из аккорда в MATLAB

02.11.2021

Рассмотрены 3 темы по основам цифровой обработки сигналов: знакомство с MATLAB, создаем аккорд в MATLAB, выделяем тон из аккорда в MATLAB.

В данном посте освещены 3 темы по основам цифровой обработки сигналов:

 

Знакомство с MATLAB

В этом публикации мы впервые познакомимся с MATLAB. MATLAB – это интегрированная среда разработки и это язык программирования, поэтому в какой-то степени мы будем заниматься программированием. Но тут всё достаточно просто, и я думаю сейчас вы сами во всём убедитесь. Давайте откроем основное окно среды MATLAB.

Здесь у нас есть три основные панели:

  • Current Folder, где мы храним файлы с которыми мы работаем;
  • командное окно, куда мы вводим команды;
  • Workspace или рабочее пространство для хранения переменных.

Давайте создадим переменную a значением 4. Она появилась в рабочем пространстве: значение 4, размер 11, класс double. Создадим переменную b, присвоим ей значение 6, и переменную с равную b/ a. Увидим, что в рабочем пространстве у нас появились 3 скалярные величины.

Теперь давайте создадим вектор. Вектор мы будем создавать достаточно просто, мы запишем значение вектора в квадратных скобках. Это произвольные значения, целочисленные, дробные, положительные и отрицательные. Я сделаю вектор из 10 элементов, в конце я поставлю точку с запятой, чтобы результат не выводился в командное окно.

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

Пока что давайте отметим то, что MATLAB – язык векторизованный, то есть допустим я хочу добавить к каждому элементу вектора X двойку, мне достаточно написать:

x = x + 2

Вы увидите то, что к каждому элементу добавилась двойка.

Или я хочу применить функцию модуля. Воспользуемся функцией abs, применим ее ко всему вектору X и убедимся, что в результирующем векторе Y нет отрицательных значений (y=abs(x)). 

 

Или я хочу получить квадратный корень из вектора Y (Z = sqrt(Y)), и каждый элемент вектора Z будет квадратным корнем из соответствующего элемента вектора Y.

Наши вектора можно визуализировать на графиках. Давайте выберем наш вектор X, перейдём на вкладку plots, выберем стандартный линейный график plot.

Вот так вот выглядит отсчёты нашего вектора X, соединённые линиями. Тоже самое мы можем сделать например с вектором Z, также выбираем его, нажимаем кнопку plot.

Если теперь мы захотим на одних осях построить два графика, давайте попробуем выбрать X и Z вместе и нажать на кнопку plot.

Мы увидим не совсем правильную картину. Разобраться в этом нам поможет документация к функции plot. Можем открыть центр документации и убедиться в том, что первый аргумент, который мы передаем функции  – это значение, которое мы откладываем по оси X, второй аргумент – который мы по откладываем по оси Y. Поэтому теперь нам нужно создать некий условный вектор времени t, который мы будем откладывать по оси Х для визуализации. Создадим его при помощи оператора двоеточия. Синтаксис такой: мы сначала пишем начальное значение, потом шаг через двоеточие и конечное значение (t = 0:2:18). Мы получили строку с равномерно нарастающим значениями от 0 до 18. В этой строке также 10 элементов, и мы теперь записываем команду plot так: plot(t,x,t,z). Теперь уже на одних осях мы будем наблюдать две линии. 

Кстати стиль и вид линии мы можем настраивать через Property Inspector. К примеру, можно выбрать линию, отвечающую за наш первый вектор X, сделать её потолще, например настроить параметры толщины линии, добавить маркеры, то есть определённые визуальные отметки в тех местах, где у нас находятся наши отсчеты сигнала. Также можно настроить цвета, можем настроить стиль и толщину второй линии, которая отражает наш вектор Z. То есть фактически мы можем здесь полностью настроить визуализацию под себя. Помимо линии мы также можем настраивать параметры осей, подписи по осям, пределы, причем всё это можно сделать как интерактивно, так и программно, указывая дополнительные параметры при вызове функции plot.

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

 

Наверх

Создаем аккорд в MATLAB

Первая задача, которую мы попробуем решить – это создание музыкального аккорда в MATLAB. Давайте подробнее расскажу о задаче. Мы попробуем создать сумму трёх синусоидальных колебаний, причём они должны составить аккорд Ля мажор. У нас здесь представлена таблица частоты звучания нот по октавам.

Нас интересует ля первой октавы 440 Гц, до# второй октавы 554 и 37 Гц и ми второй октавы 659 и 26 Гц. Для простоты их немножко округлим таким образом, что у нас а будет 440 Гц, до# примерно 550 Гц, а ми 660 Гц.

Давайте перейдём в MATLAB и попробуем создать эту самую сумму. Начнём мы с создания одной синусоиды, ноты ля, запишем центральную частоту fc 440 Гц, затем укажем частоту дискретизации 8000 Гц. Частота дискретизации – это параметр, обратный периоду дискретизации, то есть нашему шагу временной сетки. Наш период дискретизации будет 1,25x10–4.

Теперь мы сможем создать наш вектор t похожим образом: начальное значение, шаг, конечное значение. Наш промежуток временной от 0 до 0,1 секунды с нарастающим шагом 1,25x10–4. Вектор t – это вектор-строка из 801 элемента.

На его основе мы можем теперь создать наш вектор синусоиду.  Воспользуемся функцией cos для того, чтобы создать косинусоидальный сигнал. Далее запишем х=cos(2*pi*fc*t). Обратите внимание, что мы вектор строку t умножаем на скалярные величины pi и fc. В этом случае результирующий вектор Х у нас также становится вектором-строкой из 801 отсчёта.

Функция косинус начинается со своего максимального значения, поэтому размах нашей синусоиды должен быть от –1 до +1. Давайте убедимся в этом, визуализировав вектор командой plot.

Вот мы действительно наблюдаем нашу синусоиду в пределах от +1 до –1. Можем воспользоваться интерактивным инструментом zoom для того, чтобы приблизить интересующую нас область, рассмотреть нашу синусоиду чуть поближе.

Также нам здесь доступны значения каждой точки нашего вектора x. Мы можем наблюдать его значения времени и значения косинуса в соответствующей точке времени.

Теперь давайте послушаем нашу синусоиду, для этого мы воспользуемся командой Sound. Ей мы передаем наш вектор x и значение частоты дискретизации fs (sound(x,fs)). Короткий сигнал всего лишь на десятые секунды. Он действительно звучит как ля первой октавы.

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

Почему это важно? Мы не будем менять синтаксис задания синусоиды. Мы также запишем y=cos(2*pi*fc*t). Но в этом случае мы уже не перемножаем скалярные величины на вектор, мы перемножаем скалярные величины на вектор-столбец и на вектор-строку. T – вектор-строка, fc – вектор-столбец. Результат перемножения будет матрица. Давайте выполним функцию и увидим то, что у это нас матрица 3 на 801. Если мы посмотрим на неё в редакторе переменных, мы увидим то, что в каждой строке матрицы содержатся отдельные синусоиды.

Давайте визуализируем их на графике командой plot. Мы можем передать команде plot всю матрицу y целиком и мы будем наблюдать здесь три синусоиды различными цветами. Давайте опять-таки также приблизим немножко и убедимся, что это действительно 3 синусоидальных сигнала с разной частотой повторения.

У нас есть наши три синусоиды. Интересно, если мы теперь передадим всю матрицу команде Sound, услышим ли мы наш аккорд Ля мажор. Давайте попробуем это сделать. Мы также передадим ей Y и Fs. Наблюдаем ошибку, то есть матрицу команда Sound проиграть не сможет. Мы можем проиграть отдельные строки из этой матрицы:

sound(y(1,:),fs)
sound(y(2,:),fs)
sound(y(3,:),fs)

То есть мы явно слышали наши 3 тона: ля, до# и ми.

Если мы хотим услышать аккорд, нам нужна сумма этих тонов. Поэтому мы воспользуемся встроенной функцией sum, которая сложит нам значение в строках нашей матрицы (z=sum(y)). Давайте посмотрим на вектор z, это вектор-строка.

Мы видим, что он действительно сложил элементы в столбцах матрицы. Но теперь нам нужно его пронормировать, чтобы размах нашего сигнала также был в пределах от –1 до +1. Убедимся в этом опять-таки в редакторе переменных, то, что начальное значение у нас снова один и визуализируем этот вектор командой plot. Пишем plot(t,z) и наблюдаем такую картину:

Вот так выглядит сумма трёх синусоид во временной области. Так выглядит наш аккорд Ля мажор. Теперь мы хотим его послушать, но мне не очень нравится слушать короткие отрезки по 0,1 секунде, поэтому давайте сделаем вектор подлиннее, для этого воспользуемся встроенной функции repmat для того, чтобы сделать 10 копий нашего вектора z. Назовём результирующий вектор Achord, и вот как раз его мы будем слушать.

Вы видите то что у него теперь 8010 отчётов. Теперь мы его передадим команде sound, запишем sound(Achord,fs) и послушаем… Так звучит синтезированный аккорд ля-мажор в MATLAB. Обработка этого синтезированного сигнала будет в следующей публикации. 

 

Наверх

Выделяем тон из аккорда в MATLAB

В этой публикации мы попробуем методами цифровой обработки сигналов выделить из аккорды отдельный тонн. Поможет нам в этом инструмент Signal Analyzer App. Этот инструмент входит в состав программного расширения для MATLAB Signal Processing Toolbox. Signal Processing Toolbox – это программное расширение специально для цифровой обработки сигналов. В нём есть наборы готовых функций и интерактивных приложений. Одно из этих приложений, Signal Analyzer App, мы и будем использовать. Оно замечательно подходит новичкам в цифровой обработке сигналов.

Интерактивные приложения в MATLAB располагаются на специализированной вкладке APPS. Там мы можем найти приложение Signal Analyzer, кликаем на его иконку, открывается его интерфейс.

Здесь нам доступны все векторные данные из нашего workspace’а. Выбираем наш вектор Achord и сразу же визуализируем его во временной области. На вкладке Display мы можем выбрать zoom и приблизить интересующую нас область.

Но нам надо добавить ему значение времени. Мы можем указать ему частоту дискретизации таким образом, чтобы у него по оси X откладывались не отчёты, а секунды.

Теперь мы убедимся в том, что у нас действительно сигнал длительностью 1 секунда. Можем приблизить его и отразить его cпектр, нажав кнопку Spectrum.

Здесь увидим 3 явных пика: это частоты 440, 550 и 660 Гц, то есть наши три тона, из которых и состоит наш аккорд. Но мы хотим попробовать выделить один тон, мы выберем центральный тон 550 Гц или до# второй октавы, и теперь методами цифровой обработки сигналов попробуем подавить ля и ми. Мы можем создать копию нашего исходного сигнала, выбрав кнопку duplicate. Переименуем его сразу под названием Сsharp, что значит до#, и над ним уже  будем проводить операции цифровой обработки. Мы воспользуемся инструментом Bandpass filter или полосно-пропускающий фильтр и выделим частоты в промежутке от 540 до 560 Гц, нажимаем кнопку Bandpass и наблюдаем то, что этот фильтр пропустил центральную частоту в 550 гц и подавил частоты 440 и 660 Гц. Результирующий сигнал во временной области действительно напоминает простую синусоиду.

Теперь мы можем экспортировать этот вектор в рабочее пространство MATLAB и проанализировать его стандартным образом. Мы хотим ещё раз убедиться в том, что действительно Csharp похож на синус, поэтому визуализируем его командой plot, записываем plot(t,Csharp) и наблюдаем ошибку. Вектора должны быть одной и той же длины. Давайте возьмём только первые 801 отсчёт из вектора Csharp. Теперь мы действительно можем их визуализировать один относительно другого, некоторые искажения есть, но по форме действительно это обыкновенный синусоидальный сигнал.

Давайте послушаем его командой Sound, чтобы убедиться, что это действительно до#.

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

 

Предыдущая публикация по данной теме:

Основы цифровой обработки сигналов: введение, сигналы, шумы, помехи, решаемые задачи

Теги

      02.11.2021

      Комментарии