Document 102435

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
(ФГБОУ ВПО «КубГУ»)
Кафедра информационных технологий
ЦИФРОВАЯ ОБРАБОТКА СИГНАЛОВ
Т. В. Кирогосян
Краснодар 2014
СОДЕРЖАНИЕ
Введение…...………………………………………………………………3
1 Понятия цифровой обработки сигналов……………………....….........5
1.1 Основные задачи………….………………...................................5
1.2 Преобразование Фурье и его применение……….......................7
2 Кодирование цифровой информации………………….……………..11
2.1 Принципы оцифровки звука.............…..……………...…….....11
2.2 Кодирование оцифрованного звука.......................……….........15
2.2 Методы кодирования.…………..................................................17
3 Гармонические колебания………...……………….….........................19
4 Практическая реализация проекта…………………………………....21
4.1 Алгоритм работы программы………………………………….25
Заключение……………………………………………………………….27
Список использованных источников………………………………...…28
Приложение А. Код программы………………………………………..29
2
ВВЕДЕНИЕ
В основе многих компьютерных приложений, связанных с обработкой
мультимедийной информации, лежат алгоритмы цифровой обработки сигналов. Цифровой обработкой сигналов принято называть в вычислительной
технике арифметическую обработку последовательностей равноотстоящих во
времени отсчетов. Под цифровой обработкой понимают также обработку одномерных и многомерных массивов данных. Безусловно, данная обработка
может быть выполнена с помощью обычных вычислительных средств. На современных ПК это не представляет никаких трудностей. Однако именно специфика последовательности предоставляет дополнительные возможности для
достижения высокой эффективности при жестких ограничениях систем реального времени.
Системы и методы цифровой обработки также разрабатывались в оборонных отраслях в первую очередь для решения задач радиолокации, обработки гидроакустических и тепловизионных сигналов. В области военного
морского приборостроения системы цифровой обработки использовались, в
частности, для анализа гидроакустических сигналов, определения шумовых
паспортов кораблей на основе спектральных характеристик, вычисления корреляционных зависимостей паспорта и реального гидроакустического сигнала.
Современное гражданское применение методов цифровой обработки
лежит в области мультимедийных технологий, то есть обработки звука и
изображений, включающей их сжатие, кодировку. В области цифровой связи
цифровыми методами выполняется модуляция и демодуляция данных для передачи по каналам связи.
Процессоры цифровой обработки сигналов в бытовой работе постоянно обрабатывают цифровую информацию: фильтруют, анализируют, распознают, моделируют/демодулируют, кодируют/декодируют и т.д..
Цифровая обработка, в отличие от аналоговой, традиционно использу3
емой во многих радиотехнических устройствах, является более дешевым
способом достижения результата, обеспечивает более высокую точность, миниатюрность и технологичность устройства, температурную стабильность.
При обработке цифровых сигналов, к примеру, радиолокатора, используются алгоритмы цифровой фильтрации и спектрального анализа (вычисление дискретного и быстрого преобразования Фурье), алгоритмы корреляционного анализа, обратной свертки, специальные алгоритмы линейного предсказания.
В системах обработки звука цифровые процессоры обработки сигнала
решают задачи анализа, распознавания и синтеза речи, сжатия речи в системах телекоммуникации.
Целью данной работы является разработка приложения для основ работы с цифровой обработкой сигналов, в частности – разработка т.н. «гитарного тюнера», определяющего ноту по звучащей гитарной струне. В данной
работе аналоговой сигнал, получаемый от струны гитары, преобразуется в
дискретный цифровой с помощью входного звукозаписывающего устройства.
Приложение, получив цифровой сигнал, с помощью дискретного преобразования Фурье преобразует его в непрерывную гармонику и сверяет полученный результат с эталонным. В результате анализа выдаются соответствующие
рекомендации по настройке струны.
4
1 Понятия цифровой обработки сигналов
Цифровая обработка сигналов (ЦОС, DSP- англ. Digital signal processing) - преобразование сигналов, представленных в цифровой форме.
Любой непрерывный (аналоговый) сигнал s(t) может быть подвергнут
дискретизации по времени и квантованию по уровню (оцифровке), то есть
представлен в цифровой форме.
При помощи математических алгоритмов s(k) преобразуется в некоторый другой сигнал s1(k), имеющий требуемые свойства. Процесс преобразования сигналов называется фильтрацией, а устройство, выполняющее фильтрацию, называется фильтр. Поскольку отсчёты сигналов поступают с постоянной скоростью Fd, фильтр должен успевать обрабатывать текущий отсчет
до поступления следующего, то есть в реальном времени. Для обработки
сигналов (фильтрации) в реальном времени применяют специальные вычислительные устройства – цифровые сигнальные процессоры.
Различают методы обработки сигналов во временной и в частотной
области. Эквивалентность частотно-временных преобразований однозначно
определяется через преобразование Фурье.
1.1 Основные задачи
Линейная фильтрация – селекция сигнала в частотной области, синтез
фильтров, согласованных с сигналами, частотное разделение каналов, цифровые преобразователи и дифференциаторы, корректоры характеристик каналов.
Линейный фильтр – динамическая система, применяющая некий линейный оператор ко входному сигналу для выделения или подавления определенных частот сигнала и других функций по обработке входного сигнала.
Наиболее часто они используются для того чтобы выделить нужную полосу
частот в сигнале. Существует большое количество различных типов и моди5
фикаций линейных фильтров.
Линейные фильтры разделяются на два больших класса по виду импульсной переходной функции: фильтр с бесконечной импульсной характеристикой и фильтр с конечной импульсной характеристикой.
По виду частотной характеристики фильтры подразделяются на фильтр
низких частот, фильтр высоких частот, полосовой фильтр, режекторный
фильтр (обратный полосовому) и фазовый фильтр, который пропускает все
частоты сигнала, но изменяет его фазу.
Линейные фильтры всех видов могут быть однозначно описаны с помощью их амплитудной и фазо-частотной характеристик, либо импульсной
характеристики. С математической т.з. непрерывные БИХ-фильтры описываются линейными дифференциальными уравнениями, а их импульсные характеристики – функции Грина для этих уравнений. Непрерывные фильтры также могут быть описаны с помощью преобразования Лапласса импульсной
характеристики.
Спектральный анализ – обработка речевых, звуковых, сейсмических,
гидроакустических сигналов, распознавание образов.
Спектральный анализ – совокупность методов качественного и количественного определения состава объекта, основанная на изучении спектров
взаимодействия материи с излучением, включая спектры электромагнитного
излучения, акустических волн, распределения по массам и энергиям элементарных частиц и др..
Частотно-временной анализ – компрессия изображений, гидро- и радиолокация, разнообразные задачи обнаружения сигнала.
Адаптивная фильтрация – обработка речи, изображения, распознавание образов, подавление шумов, адаптивные антенные решетки.
Нелинейная обработка – вычисление корреляций, медианная фильтрация, синтез амплитудных, фазовых, частотных детекторов, обработка речи,
векторное кодирование.
Многоскоростная обработка – интерполяция (увеличение) и децима6
ция (уменьшение) частоты дискретизации в многоскоростных системах телекоммуникации, аудиосистемах.
Секционная свертка используется, когда количество элементов одной из
последовательностей в несколько раз больше, чем количество элементов другой. Секционная свертка может выполняться методом суммирования или методом перекрытия. Для реализации этого типа свертки нужно выполнить следующие действия:
- поделить большую последовательность на секции, желательно чтоб в каждой секции было одинаковое количество элементов.
- произвести подсчет количества значений частичной выходной последовательности (чвп) по формуле:
Nчвп=Nc+N-1, где Nчвп – количество значений в частичной выходной последовательности, Nc- количество значений в данной секции, N –количество значений во второй последовательности.
- произвести свертку каждой секции первой последовательности со второй
последовательностью. Количество сверток должно совпадать с количеством
секций в первой последовательности.
1.2 Преобразование Фурье и его применение
Преобразование Фурье – операция, сопоставляющая функции вещественной переменной другую функцию вещественной переменной. Эта новая
функция описывает коэффициенты («амплитуды») при разложении исходной
функции на элементарные составляющие – гармонические колебания с разными частотами. Преобразование Фурье функции f вещественной переменной является интегральным и задается следующей формулой:
F(w)=
1
∞
𝑓(𝑥)𝑒 −𝑖𝑥𝑤 𝑑𝑥 .
∫
−∞
√2𝜋
(1)
Хотя формула, задающая преобразование Фурье, имеет ясный смысл
только для функций класса L1(ℝ), преобразование Фурье может быть опреде7
лено и для более широкого класса функций и даже обобщенных функций.
Это возможно благодаря ряду свойств преобразования Фурье:
а) Преобразование Фурье является линейным оператором.
б) 𝐿1(ℝ) ∩ 𝐿2(ℝ).
(2)
Это свойство позволяет по непрерывности распространить определение преобразования Фурье на все пространство 𝐿2(ℝ). Равенство Парсеваля
будет при этом справедливо для всех 𝐿2(ℝ) ∋ 𝑓.
в) Формула обращения:
1
∞
∫ 𝑓(𝑤)𝑒 −𝑖𝑥𝑤 𝑑𝑤 .
√2𝜋 −∞
F(x)=
(3)
Справедлива, если интеграл в правой части имеет смысл. В частности,
это верно, если функция f является достаточно гладкой. Если 𝐿2(ℝ) ∋ 𝑓 , то
формула также верна, поскольку равенство Парсеваля позволяет придать интегралу в правой части смысл с помощью предельного перехода.
Эта формула обьясняет физический смысл преобразования Фурье:
правая часть – (бесконечная) сумма гармонических колебаний 𝑒 𝑖𝑥𝑤 с частотами w, амплитудами
1
√2𝜋
|𝑓(𝑤)| и фазовыми сдвигами arg f(w) соответственно.
г) Теорема о свертке: если f,g∈ 𝐿1(ℝ), то
^(f*g) =√2𝜋^f^g,
(4)
∞
(f*g)(t)=∫−∞ 𝑓(𝑡 − 𝑠)𝑔(𝑠)𝑑𝑠
(5)
д) Преобразование Фурье и дифференцирование.
Если f, f`∈ 𝐿1(ℝ), то
^(f`)=iw^f.
(6)
В обработке сигналов и связанных областях преобразование Фурье
обычно рассматривается как декомпозиция сигнала на частоты и амплитуды,
т.е. обратимый переход от временного пространства в частотное пространство. Богатые возможности применения основываются на нескольких полез8
ных свойствах преобразования:
- Преобразования являются линейными операторами и, с соответствующей нормализацией, унитарными (Теорема Парсеваля).
- Преобразования обратимы, причем обратное преобразование имеет
практически такую же форму, как и прямое преобразование.
- Синусоидальные базисные функции (вернее, комплексные экспоненты) являются собственными функциями дифференцирования, что означает,
что данное представление превращает линейные дифференциальные уравнения с постоянными коэффициентами в обычные алгебраические. (Например,
в линейной стационарной системе частота есть консервативная величина, поэтому поведение на каждой частоте может решаться независимо).
- По теореме о свертке, преобразование Фурье превращает сложную
операцию свертки в простое умножение, что означает, что они обеспечивают
эффективный способ вычисления основанных на свертке операций, таких как
умножение многочленов и умножение больших чисел.
В работе будет использована дискретная версия преобразования Фурье
с использованием алгоритма быстрого преобразования Фурье (БПФ, англ
FFT).
Дискретное преобразование Фурье – преобразование конечных последовательностей (комплексных) чисел, которое, как и в непрерывном случае,
превращает свёртку в поточечное умножение. Кроме ЦОС используется также в тех случаях, когда необходимо быстро выполнить свертку, например при
умножении больших чисел.
Пусть x0,x1,…,xn-1 – последовательность комплексных чисел. Рассмотрим многочлен f(t)=x0+x1t+x2t2+…+xn-1tn-1. Выберем какие-нибудь n точек на
комплексной плоскости z0,z1,…,zn-1. Теперь многочлену f(t) мы можем сопоставить новый набор из n чисел:
F0:=f(z0),f1=f(z1),…,fn-1=f(zn-1).
Набор {fk} и называется дискретным преобразованием Фурье исходного набора {xk}. В качестве точек zk обычно выбирают корни n-й степени из
9
единицы:
𝑧𝑘 = 𝑒
2𝜋𝑖𝑘
𝑛
.
(7)
Такой выбор продиктован тем, что в этом случае обратное преобразование принимает простую форму, а также тем, что вычисление преобразования Фурье по быстрому алгоритму может быть выполнено за O(nlogn) операций.
В терминах обработки сигналов преобразование берет представление
функции сигнала в виде временных рядов и отображает его в частотный
спектр, где w –угловая частота. Т.е. оно превращает функцию времени в
функцию частоты, это разложение функции на гармонические составляющие
на различных частотах. Когда функция f является функцией времени и представляет физический сигнал, преобразование имеет стандартную интерпретацию как спектр сигнала. Абсолютная величина получающейся в результате
комплексной функции F представляет амплитуды соответствующих частот
(w), в то время как фазовые сдвиги получаются как аргумент этой комплексной функции.
Теорема Котельникова гласит, что если аналоговый сигнал x(t) имеет
конечный (ограниченный по ширине) спектр, то он может быть восстановлен
однозначно и без потерь по своим отсчетам, взятым с частотой, большей или
равной удвоенной верхней частоте fc.
Такая трактовка рассматривает идеальный случай, когда сигнал начался
бесконечно давно и никогда не закончится, а также не имеет во временной
характеристике точек разрыва. Разумеется, реальные сигналы (например, звук
на цифровом носителе) не обладают такими свойствами, так как они конечны
по времени и обычно имеют разрывы во временной характеристике. Соответственно, их спектр бесконечен. В таком случае полное восстановление сигнала невозможно и из теоремы Котельникова вытекают два следствия:
- любой аналоговый сигнал может быть восстановлен с какой угодно
точностью по своим дискретным отсчетам, взятым с частотой f>2fc, где fc –
10
максимальная частота которой ограничен спектр реального сигнала.
- если максимальная частота в сигнале превышает половину частоты
дискретизации, то способа восстановить сигнал из дискретного в аналоговый
не существует.
11
2 Кодирование звуковой информации
В основе кодирования звука с использованием ПК лежит процесс преобразования колебаний воздуха в колебания электрического тока и последующая дискретизация аналогового электрического сигнала. Дискретизация –
преобразование непрерывной функции в дискретную. Аналоговый сигнал –
сигнал данных, у которого каждый из представляющих параметров описывается функцией времени и непрерывным множеством возможных значений.
Кодирование и воспроизведение звуковой информации осуществляется с помощью специальных программ. Качество воспроизведения закодированного звука зависит от частоты дискретизации и ее разрешения (глубины
кодирования звука). Частота дискретизации – частота взятия отсчетов непрерывного во времени сигнала при его дискретизации, измеряется в герцах.
2.1 Принципы оцифровки звука
Цифровой звук – это аналоговый звуковой сигнал, представленный
посредством дискретных численных значений его амплитуды.
Оцифровка звука – технология поделенным временным шагом и последующей записи полученных значений в численном виде.
Другое название оцифровки звука – аналогово-цифровое преобразование звука.
Оцифровка звука включает в себя два процесса:
- процесс дискретизации (осуществление выборки) сигнала по времени
- процесс квантования по амплитуде.
12
Рисунок 1 – Представление аналогового сигнала в цифровой форме
Процесс дискретизации по времени – процесс получения значений
сигнала, который преобразуется с определенным временным шагом – шагом
дискретизации. Количество замеров величины сигнала, осуществляемых в
одну секунду называют частотой дискретизации или частотой выборки или
частотой семплирования. Чем меньше шаг дискретизации, тем выше частота
дискретизации и тем более точное представление о сигнале нами будет получено. Это подтверждается теоремой Котельникова. Согласно ей, аналоговый
сигнал с ограниченным спектром точно описуем дискретной последовательностью значений его амплитуды, если эти значения берутся с частотой, как
минимум вдвое превышающий наивысшую частоту спектра сигнала. На
практике это означает что для того, чтобы оцифрованный сигнал содержал
информацию о всем диапазоне слышимых частот исходного аналогового сигнала (0-20 кГц) необходимо, чтобы выбранное значение частоты дискретизации составляло не менее 40 кГц. Количество замеров амплитуды в секунду
называют частотой дискретизации. Основная трудность оцифровки заключается в невозможности записать измеренные значения сигнала с идеальной
13
точностью.
Линейное (однородное) квантование амплитуды заключается в следующем алгоритме:
Отведем для записи одного значения амплитуды сигнала в памяти
компьютера N бит. Значит, с помощью одного N-битного слова можно описать 2N разных положений. Пусть амплитуда оцифровываемого сигнала колеблется в пределах от -1 до 1 некоторых условных единиц. Представим этот
диапазон изменения амплитуды – динамический диапазон сигнала в виде 2N-1
равных промежутков, разделив его на 2N уровней – квантов. Теперь, для записи каждого отдельного значения амплитуды, его необходимо округлить до
ближайшего уровня квантования. Этот процесс носит название квантования
по амплитуде. Квантование по амплитуде — процесс замены реальных значений амплитуды сигнала значениями, приближенными с некоторой точностью.
Каждый из 2 N возможных уровней называется уровнем квантования, а расстояние между двумя ближайшими уровнями квантования называется шагом
квантования. Если амплитудная шкала разбита на уровни линейно, квантование называют линейным.
Точность округления зависит от выбранного количества (2N) уровней
квантования, которое, в свою очередь, зависит от количества бит (N), отведенных для записи значения амплитуды. Число N называют разрядностью
квантования (подразумевая количество разрядов, то есть бит, в каждом слове), а полученные в результате округления значений амплитуды числа —
отсчетами или семплами (от англ. «sample» — «замер»). Принимается, что
погрешности квантования, являющиеся результатом квантования с разрядностью 16 бит, остаются для слушателя почти незаметными. Этот способ оцифровки сигнала — дискретизация сигнала во времени в совокупности с методом однородного квантования — называется импульсно-кодовой модуляцией,
ИКМ (англ. Pulse Code Modulation — PCM).
Оцифрованный сигнал в виде набора последовательных значений амплитуды уже можно сохранить в памяти компьютера. В случае, когда записы14
ваются
абсолютные
значения
амплитуды,
такой формат
запи-
си называется PCM (Pulse Code Modulation). Стандартный аудио компактдиск (CD-DA), применяющийся с начала 80-х годов 20-го столетия, хранит
информацию в формате PCM с частотой дискретизации 44.1 кГц и разрядностью квантования 16 бит.
Вышеописанный процесс оцифровки звука выполняется аналоговоцифровыми преобразователями (АЦП).
Это преобразование включает в себя следующие операции:
- Ограничение полосы частот производится при помощи фильтра
нижних частот для подавления спектральных компонент, частота которых
превышает половину частоты дискретизации.
- Дискретизацию во времени, то есть замену непрерывного аналогового сигнала последовательностью его значений в дискретные моменты времени — отсчетов. Эта задача решается путём использования специальной схемы на входе АЦП —устройства выборки-хранения.
- Квантование по уровню представляет собой замену величины отсчета сигнала ближайшим значением из набора фиксированных величин —
уровней квантования.
- Кодирование или оцифровку, в результате которого значение каждого
квантованного отсчета представляется в виде числа, соответствующего порядковому номеру уровня квантования.
- Делается это следующим образом: непрерывный аналоговый сигнал
«режется» на участки, с частотой дискретизации, получается цифровой дискретный сигнал, который проходит процесс квантования с определенной разрядностью, а затем кодируется, то есть заменяется последовательностью кодовых символов. Для записи звука в полосе частот 20-20 000 Гц, требуется
частота дискретизации от 44,1 и выше (в настоящее время появились АЦП и
ЦАП c частотой дискретизации 192 и даже 384 кГц). Для получения качественной записи достаточно разрядности 16 бит, однако для расширения динамического диапазона и повышения качества звукозаписи используется раз15
рядность 24 (реже 32) бита.
2.2 Кодирование оцифрованного звука
Для хранения цифрового звука существует много различных способов.
Оцифрованный звук являет собой набор значений амплитуды сигнала, взятых
через определенные промежутки времени.
Блок оцифрованной аудио информации можно записать в файл без изменений, то есть последовательностью чисел - значений амплитуды. В этом
случае существуют два способа хранения информации.
Первый - PCM (Pulse Code Modulation - импульсно-кодовая модуляция) - способ цифрового кодирования сигнала при помощи записи абсолютных значений амплитуд. (В таком виде записаны данные на всех аудио CD.)
Второй - ADPCM (Adaptive Delta PCM - адаптивная относительная
импульсно-кодовая модуляция) – запись значений сигнала не в абсолютных, а
в относительных изменениях амплитуд (приращениях).
Можно сжать данные так, чтобы они занимали меньший объем памяти, нежели в исходном состоянии. Тут тоже есть два способа.
Кодирование данных без потерь (lossless coding) - способ кодирования
аудио, который позволяет осуществлять стопроцентное восстановление данных из сжатого потока. К нему прибегают в тех случаях, когда сохранение
оригинального качества данных особо значимо. Существующие сегодня алгоритмы кодирования без потерь (например, Monkeys Audio) позволяют сократить занимаемый данными объем на 20-50%, но при этом обеспечить стопроцентное восстановление оригинальных данных из полученных после сжатия.
Кодирование данных с потерями (lossy coding). Здесь цель - добиться
схожести звучания восстановленного сигнала с оригиналом при как можно
меньшем размере сжатого файла. Это достигается путем использования алгоритмов, «упрощающих» оригинальный сигнал (удаляющих из него «несуще16
ственные», неразличимые на слух детали). Это приводит к тому, что декодированный сигнал перестает быть идентичным оригиналу, а является лишь
«похоже звучащим». Методов сжатия, а также программ, реализующих эти
методы, существует много. Наиболее известными являются MPEG-1 Layer
I,II,III (последним является всем известный MP3), MPEG-2 AAC (advanced
audio coding), Ogg Vorbis, Windows Media Audio (WMA), TwinVQ (VQF),
MPEGPlus, TAC, и прочие. В среднем, коэффициент сжатия, обеспечиваемый
такими кодерами, находится в пределах 10-14 (раз). В основе всех lossyкодеров лежит использование так называемой психоакустической модели.
Она занимается этим самым «упрощением» оригинального сигнала. Степень
сжатия оригинального сигнала зависит от степени его «упрощения» - сильное
сжатие достигается путем «воинственного упрощения» (когда кодером игнорируются множественные нюансы). Такое сжатие приводит к сильной потере
качества, поскольку удалению могут подлежать не только незаметные, но и
значимые детали звучания.
Кодер – программа (или устройство), реализующая определенный алгоритм кодирования данных (например, архиватор, или кодер MP 3), которая
в качестве ввода принимает исходную информацию, а в качестве вывода возвращает закодированную информацию в определенном формате.
Декодер – программа (или устройство), реализующая обратное преобразование закодированного сигнала в декодированный.
Кодек (от англ. « codec » - « Coder / Decoder ») - программный или аппаратный блок, предназначенный для кодирования/декодирования данных.
Наиболее распространённые кодеки:
MP3 – MPEG-1 Layer 3
ОGG – Ogg Vorbis
WMA – Windows Media Audio
MPC - MusePack
AAC – MPEG-2/4 AAC (Advanced Audio Coding)
Стандарт MPEG-2 AAC
17
Стандарт MPEG-4 AAC
2.3 Методы кодирования
Методы кодирования звука (конечно, имеется в виду электрический
сигнал, поступающий с микрофона) основаны на том, что теоретически любой сложный звук можно разложить на последовательность простейших гармонических сигналов разных частот, каждый из которых представляет собой
синусоиду, называемых спектром исходного сигнала. Задачей кодирования
звука, как и другого аналогового сигнала является представление его в форме
другого аналогового или цифрового сигнала, более удобного для передачи
или хранения в каждом конкретном случае. Реальные источники звука имеют
ограниченную ширину спектра, поэтому для кодирования применяют такие
методы преобразования, которые преобразуют исходный сигнал в такой,
спектр которого наиболее подходит для передачи по выбранному каналу.
Представление аналогового сигнала в виде другого аналогового сигнала
обычно называется модуляцией, а представление в цифровом виде - кодировкой. Это разделение очень условно. Аналоговый сигнал может быть представлен в виде гармонического сигнала (т.е. синусоиды), параметры которого
изменяются в зависимости от значения первоначального сигнала. В том случае, когда с изменением первоначального сигнала изменяется амплитуда синусоиды - мы имеем дело с амплитудной модуляцией (AM). Если в зависимости от значения исходного сигнала изменяются частота или фаза синусоиды мы имеем дело с частотной модуляцией (FM) или фазовой модуляцией (PM).
Амплитудная и частотная модуляция, например, широко используются для
передачи звука по радио. Эти виды модуляции, конечно, не являются разложением исходного сигнала по гармоникам. Развитие цифровой техники и
применение компьютерной обработки и хранения информации привело к широкому применению импульсных методов модуляции или кодирования. Такими видами модуляции являются, например, импульсно-кодовая модуляция,
18
при которой значение исходного сигнала через определенные промежутки
времени представляется в виде кода. Для получения цифрового кода аналоговой величины применяют специальные устройства — аналогово-цифровые
преобразователи (АЦП). Обратное преобразование для воспроизведения звука, закодированного числовым кодом, выполняют цифро-аналоговые преобразователи (ЦАП). Подавляющее большинство "компьютерного звука" является именно записью двоичного кода сигнала, полученного через небольшие
равные промежутки времени, определяемые частотой дискретизации. Для
хранения и передачи по каналам связи такой сигнал обычно подвергается
сжатию (уменьшению объема путем отбрасывания ненужной или малозначимой информации).
Кроме импульсно-кодовой модуляции для кодирования звука применяют и другие виды цифровой модуляции (широтно-импульсную, частотно
импульсную и пр.). Эти виды модуляции иногда применяют для передачи
звука по цифровым каналам, но в компьютерной технике их используют редко и в основном как промежуточные для некоторых видов цифровой фильтрации и создания звуковых эффектов.
19
3 Гармонические колебания
Любое гармоническое колебания можно превратить в синусоиду (как
и любое другое гармонические колебание):
Рисунок 2 – Синусоиды гармонического колебания
Как видно, фактически график синуса получается из вращения вектора, который описывается формулой
f(t) = A sin (ωt + φ)
(9)
где A — длина вектора (амплитуда колебаний), φ — начальный угол (фаза)
вектора в нулевой момент времени, ω — угловая скорость вращения, которая
равна:
ω=2 πf,
(10)
где f — частота в Герцах
Как мы видим, что зная частоту сигнала, амплитуду и угол, мы можем
построить гармонический сигнал.
Представление абсолютно любого сигнала можно представить в виде
суммы (зачастую бесконечной) различных синусоид. Иначе говоря, в виде ря20
да Фурье.
Для примера возьмем пилообразный сигнал:
Рисунок 3 – Пилообразный сигнал
Его сумма описывается следующей формулой:
(11)
Рисунок 4 – Формула суммы пилообразного сигнала
Если мы будем поочерёдно суммировать, брать сначала n=1, затем n=2
и т.д., то увидим, как у нас гармонический синусоидальный сигнал постепенно превращается в пилу:
Рисунок 5 – Превращение гармонического синусоидального сигнала
Более сложные сигналы это сумма проекции множества вращающих
векторов, точнее их суммы.
21
4 Практическая реализация проекта
В качестве среды разработки был выбран Qt 5.2.
Qt (произносится /ˈkjuːt/ (кьют) как «cute» или неофициально Q-T
(кью-ти)) — кроссплатформенный инструментарий разработки ПО на языке
программирования C++. Есть также «привязки» ко многим другим языкам
программирования: Python — PyQt, PySide; Ruby — QtRuby; Java — Qt
Jambi; PHP — PHP-Qt и другие.
Позволяет запускать написанное с его помощью ПО в большинстве
современных операционных систем путём простой компиляции программы
для каждой ОС без изменения исходного кода. Включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и
заканчивая классами для работы с сетью, базами данных и XML. Qt является
полностью объектно-ориентированным, легко расширяемым и поддерживающим технику компонентного программирования.
Существуют
версии
Windows, систем класса UNIX с
библиотеки
для Microsoft
графической
подсисте-
мой X11, Android, iOS, Mac OS X, Microsoft Windows CE, QNX, встраиваемых
Linux-систем
и
платформы S60.
Идет
портирование
на Windows
Phone и Windows RT. Также идёт портирование на Haiku и Tizen.
До недавнего времени библиотека Qt также распространялась ещё в
одной
версии:
в Qtopia Core и
Qt/Embedded.
Теперь
распространяется
эта
как
платформа
отдельный
переименована
продукт.Qtopia
Core обеспечивает базовую функциональность для всей линейки платформ,
предназначенных для разработки приложений для встраиваемых и мобильных устройств (КПК, смартфонови т. п.).
Начиная с версии 4.5 Qt распространяется по 3 лицензиям (независимо от лицензии, исходный код Qt один и тот же):
Qt Commercial — для разработки ПО с собственнической лицензией,
22
допускающая модификацию самой Qt без раскрытия изменений;
GNU GPL — для разработки ПО с открытыми исходниками, распространяемыми на условиях GNU GPL;
GNU LGPL — для разработки ПО с собственнической лицензией, но
без внесения изменений в Qt.
До версии 4.0.0 под свободной лицензией распространялись лишь
Qt/Mac, Qt/X11, Qt/Embedded, но, начиная с 4.0.0 (выпущенной в конце
июня 2005), Qt Software «освободили» и Qt/Windows. Следует отметить, что
существовали сторонние свободные версии Qt/Windows < 4.0.0, сделанные на
основе Qt/X11.
Со времени своего появления в 1996 году библиотека Qt легла в основу тысяч успешных проектов во всём мире. Кроме того, Qt является фундаментом
популярной
рабочей
среды KDE,
входящей
в
состав
мно-
гих дистрибутивов Linux.
Отличительная особенность Qt от других библиотек — использование Meta Object Compiler (MOC) — предварительной системы обработки исходного кода (в общем-то, Qt — это библиотека не для чистого C++, а для его
особого наречия, с которого и «переводит» MOC для последующей компиляции любым стандартным C++ компилятором). MOC позволяет во много раз
увеличить мощь библиотек, вводя такие понятия, как слоты и сигналы. Кроме
того, это позволяет сделать код более лаконичным. Утилита MOC ищет в заголовочных
файлах
на C++ описания
классов,
содержащие
мак-
рос Q_OBJECT, и создаёт дополнительный исходный файл на C++, содержащий метаобъектный код.
Qt позволяет создавать собственные плагины и размещать их непосредственно в панели визуального редактора. Также существует возможность
расширения привычной функциональности виджетов, связанной с размещением их на экране, отображением, перерисовкой при изменении размеров окна.
Qt комплектуется визуальной средой разработки графического интер23
фейса «Qt Designer», позволяющей создавать диалоги и формы в режиме WYSIWYG. В поставке Qt есть «Qt Linguist» — графическая утилита,
позволяющая упростить локализацию и перевод программы на многие языки;
и «Qt Assistant» — справочная система Qt, упрощающая работу с документацией по библиотеке, а также позволяющая создавать кросс-платформенную
справку для разрабатываемого на основе Qt ПО. Начиная с версии 4.5.0 в
комплект Qt включена среда разработки «Qt Creator», которая включает в себя
редактор кода, справку, графические средства «Qt Designer» и возможность
отладки приложений. «Qt Creator» может использовать GCC или Microsoft
VC++ в качестве компилятора и GDB в качестве отладчика. Для Windows версий библиотека комплектуется компилятором, заголовочными и объектными
файлами MinGW.
Библиотека разделена на несколько модулей:
QtCore — классы ядра библиотеки, используемые другими модулями;
QtGui — компоненты графического интерфейса;
QtNetwork — набор классов для сетевого программирования. Поддержка различных высокоуровневых протоколов может меняться от версии к
версии. В версии 4.2.x присутствуют классы для работы с протоколами FTP и HTTP. Для работы с протоколами TCP/IP предназначены такие
классы, как QTcpServer, QTcpSocket для TCP и QUdpSocket для UDP;
QtOpenGL — набор классов для работы с OpenGL;
QtSql — набор классов для работы с базами данных с использованием
языка структурированных запросов SQL. Основные классы данного модуля в
версии 4.2.х: QSqlDatabase — класс для предоставления соединения с базой,
для работы с какой-нибудь конкретной базой данных требует объект, унаследованный от класса QSqlDriver — абстрактного класса, который реализуется
для конкретной базы данных и может требовать для компиляции SDK базы
данных.
Например,
для
сборки
драйвера
под
базу
дан-
ных Firebird/InterBase требует .h файлы и библиотеки статической линковки,
входящие в комплект поставки данной БД;
24
QtScript — классы для работы с Qt Scripts;
QtSvg — классы для отображения и работы с данными Scalable Vector
Graphics (SVG);
QtXml —
модуль
для
работы
с XML,
поддерживает-
ся SAX и DOM модели работы;
QtDesigner — классы создания расширений QtDesigner’а для своих
собственных виджетов;
QtUiTools — классы для обработки в приложении форм Qt Designer;
QtAssistant — справочная система;
Qt3Support — модуль с классами, необходимыми для совместимости с
библиотекой Qt версии 3.х.х;
QtTest — модуль для работы с UNIT тестами;
QtWebKit — модуль WebKit, интегрированный в Qt и доступный через
её классы;
QtXmlPatterns — модуль для поддержки XQuery 1.0 и XPath 2.0;
Multimedia — модуль для поддержки воспроизведения и записи видео
и аудио, как локально, так и с устройств и по сети;
QtCLucene — модуль для поддержки полнотекстового поиска, применяется в новой версии Assistant в Qt 4.4;
ActiveQt — модуль для работы с ActiveX и COM технологиями для Qtразработчиков под Windows.
QtDeclarative — модуль, предоставляющий декларативный фреймворк
для создания динамичных, настраиваемых пользовательских интерфейсов.
Также реализована технология WoC — widgets on canvas, с помощью
которой реализована Plasma в KDE 4.1, Будет возможным использовать виджеты библиотеки Qt прямо в аплетах. Обеспечивает расположение виджетов
на QGraphicsView с возможностью масштабирования и различных графических эффектов.
Библиотека использует собственный формат проекта, именуемый .pro
файлом, в котором собрана информация о том, какие файлы будут скомпили25
рованы, по каким путям искать заголовочные файлы и много другой информации. Впоследствии при помощи утилиты qmake из них получаются
makefile для make-утилиты компилятора. Также есть возможность работы при
помощи интеграторов с Microsoft Visual Studio 2003/2005/2008/2010. Совсем
недавно стала доступна интеграция в Eclipse для версии библиотеки 4.х.х.
Разработчики
на Java могут
использовать
Qt
с
помо-
щью фреймворка Qt Jambi от того же производителя (официально с 2009 года
Qt Software прекратила разработку этого фреймворка).
Проект писался в QtCreator 3, с использованием стандартных модулей
Qt: QtCore, QtGui, QtDesigner, QtMultimedia. Qt предоставляет удобные средства для проектирования пользовательского интерфейса и удобные средства
для работы с мультимедиа: звук, видео, радио и др.
4.1 Алгоритм работы программы
С помощью класса QtMultimedia Audio, содержащего классы QAudio,
QAudioBuffer, QAudioInput, QAudioFormat, QAudioDeviceInfo, со входного
Microphone устройства записывается аналоговый сигнал, аппаратно кодируемый Qt в цифровой сигнал, используя импульсно-кодовую модуляцию (PCM),
с частотой дискретизации 8000, который сохраняется в цифровой файл формата .raw, максимальная длина файла по времени составляет 5 секунд – время, за которое пользователь извлекает звук из струны . После этого данный
файл считывается в массив и передается в функцию, выполняющую быстрое
преобразование Фурье, которая возвращает массив комплексных чисел. Массив для быстрого преобразования Фурье должен представлять собой последовательность {re[0], im[0], re[1], im[1],… re[fft_size-1], im[fft_size-1]}, где
fft_size=1<< p — число точек БПФ. Это массив комплексных чисел, в нашем
случае мнимая часть равна нулю, а действительная равна значению каждой
точке массива. Ещё одна особенность именно быстрого преобразования
Фурье, что оно обсчитывает массивы, кратные только степени двойки. На вы26
ходе мы получаем комплексные числа вида {re[0], im[0], re[1], im[1],…
re[fft_size-1], im[fft_size-1]}. Вектор на комплексной плоскости определяется
действительной координатой a1 и мнимой координатой a2. Или длиной (это у
нас амплитуда Am) и углом Пси (фаза). Первая точка массива соответствует
частоте 0 Гц (постоянная), последняя точка соответствует частоте дискретизации, а именно 44100 Гц. После этого берем модуль от выходного массива и
получаем амплитудный спектр. После этого находим в данном массиве максимум, позиция максимума будет искомая частота, т.к. длина массива = частота дискретизации. Далее эту частоту сопоставляем с нотой по формуле:
N = 12*log2(f/440),
где
f
—
частота,
(12)
в
Гц,
где
находится
первый
пик
номер ноты получается в полутонах относительно ля первой октавы (эта нота
имеет частоту 440Гц, отсюда и константа в формуле).
Если N получается близким к целому — значит подстройка выполнена
точно на ту ноту, которой соответствует N. Если дробная часть N больше 0.1
или меньше 0.9 — значит подстройка неточная.
27
ЗАКЛЮЧЕНИЕ
Данная программа способна с некоторой точностью осуществить
настройку гитары, поэтому может быть полезна для любителей игры на данном инструменте.
Было выполнено сравнение данной программы с существующими
приложениями на рынке компьютерных программ. Так, например, была рассмотрена программа Chromatic Guitar Tuner.
28
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1 Горелик Г. С. Колебания и волны. Введение в акустику, радиофизику и оптику // М.: Физматлит, -1959, — 572 с
2 Амэмия Ю. С. Обработка сигналов. Первое знакомство// Одэка, - 2002. —
325 с
3 Гольденберг Л. М. и др. Цифровая обработка сигналов. Учебное пособие
для вузов. // М.: Радио и связь, 1990. — 256 с.
4 Блейхут Р. Быстрые алгоритмы цифровой обработки сигналов // М.: Мир,
1989. — 448 с.
5 Марпл-мл. С. Л. Цифровой спектральный анализ и его приложения // М.:
МИР, 1990. — С. 584.
6 Хемминг Р. В. Цифровые фильтры. // М.: Недра, 1987. — 221 с.
29
ПРИЛОЖЕНИЕ А.
Код программы.
//общая обработка
void QGuitTune::startProccessing(){
tempFile.close();
if (tempFile.exists()){
if (tempFile.open(QIODevice::ReadOnly)) {
i = 1;
QDataStream in(&tempFile);
in.setVersion(QDataStream::Qt_5_2);
while (!tempFile.atEnd()){ // считывание из файла в массив
in>>n2;
ArraySamples[i]=n2;
i++;
}
tempFile.close();
nn=i; // количество сэмплов
qWarning()<<"Количество сэмплов";
qWarning()<<nn;
for (i=1;i<=23681;i++){ // инициализация нового массива для передачи в
ффт
ArrayToFFT[i][0]=ArraySamples[i];
ArrayToFFT[i][1]=0;
}
do_fft(ArrayToFFT,ArrayResults,23681); // выполнение ффт
/* проверка воспроизведения
* tempFile.open(QIODevice::ReadOnly);
* QAudioOutput* audioo;
* audioo = new QAudioOutput(m_format,this);
* audioo->start(&tempFile);
* QTimer::singleShot(5000,Qt::PreciseTimer,this,SLOT(stopPlaying()));
* tempFile.close;
*/
for (i=1;i<=23681;i++){ //подсчет амплитуды для каждой гармоники
freq_array_amp[i] =
sqrt((ArrayResults[i][1]*ArrayResults[i][1])+(ArrayResults[i][0]*ArrayResults
[i][0]));
// qWarning()<<freq_array_amp[i]; выводит мощность частоты каждой точки в дебаггер
}
Max2 = -1;
savePos = 0;
for (i=303;i<=1212;i++) { // Частоты струн гитары: 100-400
if (freq_array_amp[i]>Max2) { // Нахождение максимума и его позиции в
массиве
Max2 = freq_array_amp[i];
savePos = i;
}
}
double delta_freq = 0.337824; // дельта частоты для массива амплитуд после ффт
nn4 = savePos*delta_freq; // определение искомой частоты
qWarning() << "Максимум в массиве" << "Частота максимума" << "Позиция
максимума в массиве"; // отладочные данные
qWarning() << Max2 << nn4 << savePos;
}
else {
qWarning() << "Error with opening file";
}
30
}
else {
qWarning() << "The file doesnt exists";
}
}
//преобразование Фурье
void QGuitTune::do_fft(fftw_complex *in, fftw_complex *out, int n) {
plan_forward = fftw_plan_dft_1d ( n, in, out, FFTW_FORWARD, FFTW_ESTIMATE
);
fftw_execute(plan_forward);
fftw_destroy_plan(plan_forward);
}
void QGuitTune::startRecording()
{
tempFile.close();
if (tempFile.exists()) {
if (tempFile.open(QIODevice::WriteOnly)) {
audio->start(&tempFile);
QTimer::singleShot(3000,Qt::PreciseTimer,this,SLOT(stopRecording()));
QTimer::singleShot(3000,Qt::PreciseTimer,this,SLOT(startProccessing()));
}
else {
qWarning() << "Error with opening file";
}
}
else {
qWarning() << "The file doesnt exists";
}
}
void QGuitTune::stopRecording()
{
if (audio->state() == QAudio::ActiveState) {
audio->stop();
tempFile.close();
delete audio;
}
else {
qWarning() << "Error with audio recording";
}
}
31
Download