Рисунок 3 – Пилообразный сигнал

Его сумма описывается следующей формулой:

  (11)

Рисунок 4 – Формула суммы пилообразного сигнала

Если мы будем поочерёдно суммировать, брать сначала n=1, затем n=2 и т. д., то увидим, как у нас гармонический синусоидальный сигнал постепенно превращается в пилу:

Рисунок 5 – Превращение гармонического синусоидального сигнала

Более сложные сигналы это сумма проекции множества вращающих векторов, точнее их суммы.

  4 Практическая реализация проекта

В качестве среды разработки был выбран Qt 5.2.

Qt (произносится /ˈkjuːt/ (кьют) как «cute» или неофициально Q-T (кью-ти)) — кроссплатформенный инструментарий разработки ПО на языке программирования C++. Есть также «привязки» ко многим другим языкам программирования: Python — PyQt, PySide; Ruby — QtRuby; Java — Qt Jambi; PHP — PHP-Qt и другие.

Позволяет запускать написанное с его помощью ПО в большинстве современных операционных систем путём простой компиляции программы для каждой ОС без изменения исходного кода. Включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML. Qt является полностью объектно-ориентированным, легко расширяемым и поддерживающим технику компонентного программирования.

Существуют версии библиотеки для Microsoft Windows, систем класса UNIX с графической подсистемой X11, Android, iOS, Mac OS X, Microsoft Windows CE, QNX, встраиваемых Linux-систем и платформы S60. Идет портирование на Windows Phone и Windows RT. Также идёт портирование на Haiku и Tizen.

НЕ нашли? Не то? Что вы ищете?

До недавнего времени библиотека Qt также распространялась ещё в одной версии: Qt/Embedded. Теперь эта платформа переименована в Qtopia Core и распространяется как отдельный продукт. Qtopia Core обеспечивает базовую функциональность для всей линейки платформ, предназначенных для разработки приложений для встраиваемых и мобильных устройств (КПК, смартфонови т. п.).

Начиная с версии 4.5 Qt распространяется по 3 лицензиям (независимо от лицензии, исходный код Qt один и тот же):

Qt Commercial — для разработки ПО с собственнической лицензией, допускающая модификацию самой 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 комплектуется визуальной средой разработки графического интерфейса «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 файлы и библиотеки статической линковки, входящие в комплект поставки данной БД;

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 файлом, в котором собрана информация о том, какие файлы будут скомпилированы, по каким путям искать заголовочные файлы и много другой информации. Впоследствии при помощи утилиты 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 — число точек БПФ. Это массив комплексных чисел, в нашем случае мнимая часть равна нулю, а действительная равна значению каждой точке массива. Ещё одна особенность именно быстрого преобразования Фурье, что оно обсчитывает массивы, кратные только степени двойки. На выходе мы получаем комплексные числа вида {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),  (12)

где f — частота, в Гц, где находится первый пик
номер ноты получается в полутонах относительно ля первой октавы (эта нота имеет частоту 440Гц, отсюда и константа в формуле).

Если N получается близким к целому — значит подстройка выполнена точно на ту ноту, которой соответствует N. Если дробная часть N больше 0.1 или меньше 0.9 — значит подстройка неточная.


ЗАКЛЮЧЕНИЕ

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

Было выполнено сравнение данной программы с существующими приложениями на рынке компьютерных программ. Так, например, была рассмотрена программа Chromatic Guitar Tuner.


СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1 Горелик и волны. Введение в акустику, радиофизику и оптику // М.: Физматлит, -1959, — 572 с

2 Амэмия сигналов. Первое знакомство// Одэка, - 2002. — 325 с

3 и др. Цифровая обработка сигналов. Учебное пособие для вузов. // М.: Радио и связь, 1990. — 256 с.

4 ыстрые алгоритмы цифровой обработки сигналов // М.: Мир, 1989. — 448 с.

5 Марпл-мл. спектральный анализ и его приложения // М.: МИР, 1990. — С. 584.

6 Хемминг фильтры. // М.: Недра, 1987. — 221 с.

ПРИЛОЖЕНИЕ А.

Код программы.

//общая обработка

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";

  }

  }

  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";

  }

}



Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4