Разработка системы автоматизированной эквализации помещений

Технологии коррекции звука в студиях и концертных залах. Виды и назначение эквалайзеров. Подготовка помещения к записи, усиление и обработка сигнала. Характеристика АЦП Arduino. Алгоритм преобразования уровня напряжения. Составление спектра сигнала.

Рубрика Коммуникации, связь, цифровые приборы и радиоэлектроника
Вид магистерская работа
Язык русский
Дата добавления 30.08.2016
Размер файла 6,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://allbest.ru

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ «ВЫСШАЯ ШКОЛА ЭКОНОМИКИ»

Московский институт электроники и математики

Выпускная квалификационная работа

магистерская диссертация

по направлению подготовки «Электроника и наноэлектроника»

Разработка системы автоматизированной эквализации помещений

Студент образовательной программы

магистратуры «Инжиниринг в электронике»

Жилякова Анна Александровна

Руководитель: К.т.н., доцент С.А. Хриткин

Консультант: Ст. преподаватель К.А. Богачёв

Оглавление

Введение

Подготовка аудиосигнала

Подготовка аудиоджека

Неинвертирующий усилитель

Преобразование уровня напряжения

Простой аналоговый вход

Непростой аналоговый вход

Прерывание

Индикатор предельной амплитуды сигнала

Составление спектра сигнала

Передача полученных данных

Заключение

Список используемой литературы

Введение

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

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

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

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

Реалии нашей жизни таковы, что немногие могут позволить себе полную акустическую отделку комнат в квартире или доме, а потому кто-то приглашает инсталляторов звукового оборудования, а кто-то пытается настроить всё самостоятельно.

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

Представленное в работе устройство способно значительно упростить и автоматизировать процесс коррекции звука в помещении. [1]

Для создания системы эквализации звука в помещении требуется выполнить ряд следующих действий:

Считать звук с источника звука (микрофона);

Подготовить его к обработке посредством микроконтроллера (предусиление);

Считать с помощью АЦП;

Произвести обработку звука;

Воспроизвести измененный сигнал.

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

Подготовка аудиосигнала

На первом рисунке представлена звуковая волна, на втором - она же в увеличенном масштабе. Звуковой сигнал в электронике - это колебания напряжений во времени. Если рассмотреть звуковой сигнал с помощью осциллографа, то картина не будет значительно отличаться (рис.3).

Типичные колебания звукового сигнала происходят вокруг значения напряжения в 0В.

Рис.1

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

Амплитуда волны на рис.3 - 2В: она достигает максимального значения напряжения 2В и минимального - -2В.

При измерении звукового сигнала с помощью одного из аналоговых входов Arduino возникает проблема: Arduino воспринимает значения только от 0В до 5В.

Если попытаться измерить отрицательные значения напряжения сигнала на рис.3, Arduino прочтет только значение 0В, и по этому значению обрежет сигнал.

Рис.2

Рис.3

Рис.4

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

В идеале нужно получить сигнал с амплитудой 2.5В, который колеблется у значения 2.5В, так чтобы минимальное значение напряжения такого сигнала было 0В, а максимальное - 5В.

Min напряжение = Среднее значение напряжение - Амплитуда

Max напряжение = Среднее значение напряжения + Амплитуда

Min напряжение = 2.5В - 2.5В = 0В

Max напряжение = 2.5В + 2.5В = 5В

На рис.4 показан сигнал, поступающий непосредственно с микрофона на осциллограф. Этот сигнал относительно слабый, с амплитудой только 200мВ.

Такой сигнал нуждается в усилении до достижении им амплитуды в 2.5В. Усиление означает увеличение амплитуды сигнала.

Рис.5

На рис.5 показан тот же самый сигнал с микрофона после усиления. Максимальное значение напряжения здесь достигло 2.5В.

Но т.к. среднее значение напряжения - всё ещё 0В, колебания происходят между значениями -2.5В и 2.5В. Поэтому необходимо сместить эти колебания в диапазон от 0 до 5В.

На рис.6 показан сигнал после смещения. Его амплитуда по-прежнему 2.5В, но центр колебаний теперь 2.5В вместо 0В, так что значение напряжения не опускается ниже 0В. Такой сигнал уже можно подавать на аналоговый вход Arduino.

Рис.6

Подготовка аудиоджека

Практически все микрофоны и электроинструменты являются моноканальными, что означает, что у них есть только один элемент, который генерирует сигнал (в отличии от стерео). В этой работе описано подключение одного аудио канала к Arduino. При желании можно повторить ту же схему для подключения любого кол-ва цепей (кол-во входов встроенного АЦП Arduino - 5. Для подключения большего кол-ва источников звука потребуется подключение внешнего АЦП). Однако следует учесть, что при увеличении кол-ва источников звука быстродействие контроллера может оказаться недостаточным, в следствии чего придется либо использовать более мощный контроллер, либо понижать частоту сэмплирования, либо применять по одному контроллеру на один канал.

Неинвертирующий усилитель

На рисунке показана схема подключения усилителя к Arduino

Усилитель TL072

Усилитель - это только первая часть схемы. Он увеличивает амплитуду сигнала от ± 200мВ до ± 2.5В. Другая функция усилителя - оградить источник звука от остальной части схемы.

Источником тока в схеме с усилителем будет являться усилитель, соответственно любая нагрузка, подключенная к усилителю, никак не отразится на источнике звука (например, микрофоне). Это можно реализовать, подключив TL072 по неинвертирующей схеме усиления.

Согласно справочной документации, TL072 должен быть запитан от +15В и -15В, но поскольку наш сигнал не будет превышать по амплитуде 2.5В, мы можем запустить этот усилитель от более низкого напряжения. Например, можно использовать две батарейки на 9В, чтобы создать источник положительного и отрицательного напряжения. Схема подключения к Arduino выглядит так: pin8 и pin4 усилителя соединяются соответствующим образом с батарейками. Сигнальный провод моноджека соединяется с неинвертирующим входом (pin3), земляная жила джека соединяется с опорным напряжением 0В. Между выходом pin1 усилителя и инвертирующим входом pin2 устанавливается резистор на 1кОм. В этой схеме можно использовать переменный резистор, чтобы регулировать коэффициент усиления. В дальнейшем мы рассмотрим, как подключить светодиод к pin13 для индикации максимального коэффициента усиления: превышение сигналом амплитуды 2.5В приведет к ограничению максимального уровня и потери части сигнала.

Следующие уравнения описывают амплитуды сигнала до и после применения неинвертирующего усилителя:

Vout =~ Vin * (1 + R2/R1)

или

Vout/Vin =~ 1 + R2/R1

Где R2 - резистор обратной связи между выходом и неинвертирующим входом, R1 - резистор, чоединенный с землей, Vout - амплитуда выходного сигнала, Vin - амплитуда входящего сигнала.

В этой цепи R2 имеет номинал 100кОм и R1 - потенциометр на 10кОм.

Когда потенциометр полностью выкручен влево, сопротивление R1 = 10кОм, и отношение выходного сигнала к выходному равно:

1+ 100/10 = 11

Исходящий из микрофона сигнал с амплитудой 200мВ (что довольно громко), будет усилен до 200мВ * 11 = 2200мВ = 2.2В

Это как раз то значение, которое нас устроит (амплитуда довольно близка к 2.5В, но не превышает это значение). Поворачивая потенциометр в среднее значение, мы получим сопротивление в 5кОм, исходя из которого нетрудно аналогичным образом посчитать коэф. усиления:

1+ 100/5 = 21

Тогда наш исходный сигнал амплитудой 200мВ после усиления будет иметь амплитуду 4.2В, что слишком много. Однако, для 100мВ такое усиление позволит достичь амплитуды в 2.1В, что снова близко к целевому значению.

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

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

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

Преобразование уровня напряжения

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

На экране осциллографа (рис.3-8), можно увидеть соответствующее изменение сигнала.

Цепь состоит из двух компонентов: делитель напряжения и конденсатор. Делитель напряжения состоит из двух резисторов по 100кОм, подключенными между источниками 5В Arduino и землей. Поскольку номиналы резисторов одинаковые, напряжение в месте их соединения делится пополам (2.5В). Между этой точкой и выходом усилителя ставится развязывающий конденсатор, номиналом 10мкФ. Когда напряжение на обкладке конденсатора со стороны усилителя поднимается и падает, это вызывает накопление заряда в конденсаторе с последующим разрядом в сторону делителя напряжения. Таким образом, напряжение в точке соединения резисторов делителя колеблется вокруг 2.5В.

Отрицательный выход конденсатора подключается к выходу усилителя, положительный - к точке соединения резисторов делителя. Также добавляется развязывающий конденсатор между этой точкой и землей, номиналом 47нФ.

Простой аналоговый вход

Самое время разобраться с тем, как прочитать сигнал с помощью Arduino. Самый простой вариант - использовать функцию Analog read и получить число от 0 до 1023 в некий момент времени. Повторяя это действие с нужной частотой (в определенных пределах), можно получить сигнал и произвести некоторую его обработку:

int incomingAudio;

void setup(){

}

void loop(){

incomingAudio = analogRead(A0);//read input from A0

//do stuff with the variable "incomingAudio"

}

При таком раскладе частота сэмплирования равна 8кГц (один раз в 125мкс). Чтобы оцифровать нормальный аудио сигнал, в соответствии с теоремой Котельникова, необходимо хотя бы 40кГц при максимальной частоте исходного сигнала в 20кГц. В некоторый случаях 8кГц может быть достаточно, тогда будет достаточно функции Analog read, поскольку это сведет сложность кода к минимуму. Поскольку мы хотим оцифровать звуковой сигнал, нам придется обойти ф-цию Analog read, чтобы повысить частоту сэмплирования.

На следующих рисунках можно увидеть, как Arduino оцифровывает входящий аналоговый сигнал 360Гц.

Непростой аналоговый вход

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

Вкратце, идея в том, что мы непрерывно читаем pinA0 и не читаем все остальные аналоговые входы. Пока функция loop занимается выполнение неких преобразований, Arduino непрерывно получает значения с аналогового входа A0 на частоте 38кГц и записывает их в переменную adch.

Когда нужно получить значение, переменная приравнивается к adch. Чтобы добиться такой частоты сэмплирования, пришлось пожертвовать разрешением сигнала.

Пользуясь функцией Analog read, мы получали значения от 0 до 1023, теперь эти значения будут от 0 до 255.

Мы вручную устанавливаем частоту АЦП на 500кГц и читаем 8 значащих бит из 10битного значения АЦП, с аналогового входа 0, для экономии времени. Выбираем 500кГц, потому что АЦП требуется 13 циклов, чтобы прочитать аналоговое значение.

500/13 =~ 38.5кГц, что довольно близко к 40кГц, стандартной частоте сэмплирования аудио сигнала.

int incomingAudio;//storage for A0 data

void setup()

{

//set up continuous sampling of analog pin 0

//clear ADCSRA and ADCSRB registers

ADCSRA = 0;

ADCSRB = 0;

ADMUX |= (1 << REFS0); //set reference voltage

ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only

ADCSRA |= (1 << ADPS2) | (1 << ADPS0); //set ADC clock with 32 prescaler- 16mHz/32=500kHz

ADCSRA |= (1 << ADATE); //enabble auto trigger

ADCSRA |= (1 << ADEN); //enable ADC

ADCSRA |= (1 << ADSC); //start ADC measurements

}

void loop(){

incomingAudio = ADCH;//get new value from A0

//do other stuff here

}

Оцифровка сигнала на частоте примерно 40кГц:

Прерывание

В прошлом листинге я описала, как непрерывно считывать аналоговый вход А0 на частоте 38.5кГц.

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

Было бы неплохо, если бы некая переменная, например, incoming_audio, обновлялась автоматически, как только менялось бы значение adch.

Такие вещи делаются с помощью прерываний. Вот так выглядит функция прерывания:

ISR(ADC_vect) {

incomingAudio = ADCH;

}

Эта функция размещается в функции SETUP. Работает это примерно так:

Arduino выполняет функцию SETUP, потом запускает бесконечный цикл функции loop, но каждые 26мкс, когда новое значение прочитывается с аналогового входа А0, Arduino на некоторое время перестает выполнять код, написанный в loop, и выполняет код, описанный в функции прерывания. В данном случае -

incomingAudio = ADCH;

Как только функция прерывания завершена, Arduino продолжает выполнять функцию loop в течение следующих 26мкс, пока не наступит следующее прерывание, и так продолжается бесконечно.

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

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

int incomingAudio;

void setup(){

cli();//disable interrupts

//set up continuous sampling of analog pin 0

//clear ADCSRA and ADCSRB registers

ADCSRA = 0;

ADCSRB = 0;

ADMUX |= (1 << REFS0); //set reference voltage

ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only

ADCSRA |= (1 << ADPS2) | (1 << ADPS0); //set ADC clock with 32 prescaler- 16mHz/32=500kHz

ADCSRA |= (1 << ADATE); //enabble auto trigger

ADCSRA |= (1 << ADIE); //enable interrupts when measurement complete

ADCSRA |= (1 << ADEN); //enable ADC

ADCSRA |= (1 << ADSC); //start ADC measurements

sei();//enable interrupts

//if you want to add other things to setup(), do it here

}

ISR(ADC_vect) {//when new ADC value ready

incomingAudio = ADCH;//update the variable incomingAudio with new value from A0 (between 0 and 255)

}

void loop(){

//do other stuff here

}

Индикатор предельной амплитуды сигнала

Как я писала ранее, если амплитуда сигнала превысит 2.5В сверху или снизу, часть сигнала будет потеряна, т.к. пики будут срезаны на уровне 5 или 0В соответственно.

Следующие рисунки показывают исходный сигнал и сигнал, видимый Arduino на частотах 8кГц и 38.5кГц.

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

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

Заведем пару новых переменных: clipping устанавливается в 1, когда уровень сигнала равен 0 или 5В, и 0 в остальных случаях.

Поскольку частота звукового сигнала достаточно высока, мигание светодиода будет не видно человеческому глазу. Поэтому нужно добавить таймер (delay(100)), что позволит увидеть мигание светодиода.

//variable to store incoming audio sample

byte incomingAudio;

//clipping indicator variables

boolean clipping = 0;

void setup(){

pinMode(13,OUTPUT);//led indicator pin

cli();//disable interrupts

//set up continuous sampling of analog pin 0

//clear ADCSRA and ADCSRB registers

ADCSRA = 0;

ADCSRB = 0;

ADMUX |= (1 << REFS0); //set reference voltage

ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only

ADCSRA |= (1 << ADPS2) | (1 << ADPS0); //set ADC clock with 32 prescaler- 16mHz/32=500kHz

ADCSRA |= (1 << ADATE); //enabble auto trigger

ADCSRA |= (1 << ADIE); //enable interrupts when measurement complete

ADCSRA |= (1 << ADEN); //enable ADC

ADCSRA |= (1 << ADSC); //start ADC measurements

sei();//enable interrupts

//if you want to add other things to setup(), do it here

}

ISR(ADC_vect) {//when new ADC value ready

incomingAudio = ADCH;//store 8 bit value from analog pin 0

if (incomingAudio == 0 || incomingAudio == 255){//if clipping

digitalWrite(13,HIGH);//set pin 13 high

clipping = 1;//currently clipping

}

}

void loop(){

if (clipping){//if currently clipping

clipping = 0;//

digitalWrite(13,LOW);//turn off clipping led indicator (pin 13)

}

delay(100);

}

[2]

Составление спектра сигнала

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

Рассмотрим подробнее этот процесс. Для построения спектра сигнала необходимо использовать Быстрое Преобразование Фурье (БПФ).В среде Arduino для этого можно использовать библиотеку fix_fft.

В основном, из этой библиотеки нас интересует процедура fix_fft, осуществляющая прямое преобразование Фурье:

/*

fix_fft() - perform forward/inverse fast Fourier transform.

fr[n],fi[n] are real and imaginary arrays, both INPUT AND

RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to

0 for forward transform (FFT), or 1 for iFFT.

*/

int fix_fft(char fr[], char fi[], int m, int inverse)

{

int mr, nn, i, j, l, k, istep, n, scale, shift;

char qr, qi, tr, ti, wr, wi;

n = 1 << m;

/* max FFT size = N_WAVE */

if (n > N_WAVE)

return -1;

mr = 0;

nn = n - 1;

scale = 0;

/* decimation in time - re-order data */

for (m=1; m<=nn; ++m) {

l = n;

do {

l >>= 1;

} while (mr+l > nn);

mr = (mr & (l-1)) + l;

if (mr <= m)

continue;

tr = fr[m];

fr[m] = fr[mr];

fr[mr] = tr;

ti = fi[m];

fi[m] = fi[mr];

fi[mr] = ti;

}

l = 1;

k = LOG2_N_WAVE-1;

while (l < n) {

if (inverse) {

/* variable scaling, depending upon data */

shift = 0;

for (i=0; i<n; ++i) {

j = fr[i];

if (j < 0)

j = -j;

m = fi[i];

if (m < 0)

m = -m;

if (j > 16383 || m > 16383) {

shift = 1;

break;

}

}

if (shift)

++scale;

} else {

/*

fixed scaling, for proper normalization --

there will be log2(n) passes, so this results

in an overall factor of 1/n, distributed to

maximize arithmetic accuracy.

*/

shift = 1;

}

/*

it may not be obvious, but the shift will be

performed on each data point exactly once,

during this pass.

*/

istep = l << 1;

for (m=0; m<l; ++m) {

j = m << k;

/* 0 <= j < N_WAVE/2 */

wr = pgm_read_word_near(Sinewave + j+N_WAVE/4);

/*Serial.println("asdfasdf");

Serial.println(wr);

Serial.println(j+N_WAVE/4);

Serial.println(Sinewave[256]);

Serial.println("");*/

wi = -pgm_read_word_near(Sinewave + j);

if (inverse)

wi = -wi;

if (shift) {

wr >>= 1;

wi >>= 1;

}

for (i=m; i<n; i+=istep) {

j = i + l;

tr = FIX_MPY(wr,fr[j]) - FIX_MPY(wi,fi[j]);

ti = FIX_MPY(wr,fi[j]) + FIX_MPY(wi,fr[j]);

qr = fr[i];

qi = fi[i];

if (shift) {

qr >>= 1;

qi >>= 1;

}

fr[j] = qr - tr;

fi[j] = qi - ti;

fr[i] = qr + tr;

fi[i] = qi + ti;

}

}

--k;

l = istep;

}

return scale;

}

Эта функция принимает на вход массив сэмплов и массив, содержащий их комплексные части, и изменяет их.

В результате работы функции массив заполняется 64 значениями амплитуд спектра сигнала. Эквалайзер, как правило, имеет 16 полос, поэтому необходимо усреднить возвращаемые значения. Сначала модифицируем код таким образом, чтобы получить массивы сэмплов, с которыми будет работать функция.

В предыдущих рассмотренных примерах мы остановились на чтении амплитуды сигнала в переменную incomingAudio, имеющую тип byte. Теперь заменим тип переменной incomingAudio на массив и добавим массив комплексных частей:

char incomingAudio[128], im[128];

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

int v[16];

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

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

В предыдущем примере мы использовали прерывание для получения значения с АЦП по мере его готовности. Добавим в процедуру прерывания процедуру построения спектра сигнала следующий код:

if (i == 128)

{

fix_fft(incomingAudio, im, 7, 0); // Преобразование Фурье for (i=0;i<64;i++)

{

incomingAudioi] = sqrt(incomingAudio[i] * incomingAudio[i] + im[i] * im[i]); // Считаем и делаем значения положительными }

for (i=1;i<16;i++) // Считаем значение для каждого столбца (отбрасываем первый - там помехи и фон 50Гц)

{

w[i] = v[i];

v[i] = (incomingAudio[i*4] + incomingAudio[i*4+1] + incomingAudio[i*4+2] + incomingAudio[i*4+3])/4; // Считаем среднее арифметическое соседних столбцов, так как у нас их всего 16, а в массиве 64 if (v[i] > 15) v[i] = 15;

}

v[0] = v[1]/2; // Значение первого столбца самых нижних частот (в котором фон 50Гц) получаем, разделив следующий на 2

//output spectrum to serial

for (int k=0; intk <= 15; k++)

{

Serial.print(v[k]);

Serial.print(" ");

}

i = 0;

}

incomingAudio[i] = ADCH;//store 8 bit value from analog pin 0 im[i] = 0;

}

В конце процедуры увеличим счетчик i:

i++;

Счетчик нужен для того, чтобы получить необходимое количество сэмплов (128).

Как только мы получаем 128 сэмплов, выполняем преобразование Фурье для массива incomingAudio (при чтении амплитуд в переменную incomingAudio [i] также заполняем массив комплексных частей амплитуд нулями).

fix_fft(incomingAudio, im, 7, 0); // Преобразование Фурье

Функция вернет результат своей работы в тот же массив.

Теперь необходимо нормировать и усреднить полученные значения:

for (i=0;i<64;i++)

{

incomingAudioi] = sqrt(incomingAudio[i] * incomingAudio[i] + im[i] * im[i]); // Считаем и делаем значения положительными }

for (i=1;i<16;i++) // Считаем значение для каждого столбца (отбрасываем первый - там помехи и фон 50Гц)

{

w[i] = v[i];

v[i] = (incomingAudio[i*4] + incomingAudio[i*4+1] + incomingAudio[i*4+2] + incomingAudio[i*4+3])/4; // Считаем среднее арифметическое соседних столбцов, так как у нас их всего 16, а в массиве 64 if (v[i] > 15) v[i] = 15; }

Первый столбец содержит помехи, поэтому его получаем, разделив следующий за ним пополам:

v[0] = v[1]/2;

[3]

Передача полученных данных

Теперь у нас есть спектр сигнала по 16 частотам, который можно использовать для осуществления коррекции звука в помещении с помощью цифрового микшерного пульта. Остается лишь донести эти значения до человека, осуществляющего управление пультом.

Здесь возможно множество вариантов, зависящих от геометрических размеров площадки, в которой происходит измерение звука, технической оснащенности, а также поставленной перед звуковым инженером задачи. В случае небольших размеров помещений спектр может воспроизводиться локально (прямо на устройстве, производящем измерения) с помощью отображения на дисплее в реальном времени (код для этого также приводится дальше, автор примера - пользователь mikesmith с сайта kasus.ru).

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

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

Для передачи данных по последовательному порту воспользуемся модулем HC12, позволяющим передавать информацию через последовательный порт на частоте 433МГц.

Здесь рассмотрим передачу данных с помощью модуля НС12: многочисленные руководства по использованию Arduino WIFI shield или популярного и недорогого модуля esp8266 нетрудно найти в интернете.

Модуль НС12 хорош тем, что обеспечивает передачу данных на достаточно большие расстояния, вместе с тем требует минимальных усилий в настройке. По умолчанию, модуль передает данные, выводимые на последовательный порт на скорости 9600 бод.

Если требуется использовать другую скорость (например, для передачи спектра сигнала в реальном времени), необзодимо выполнить настройку модуля на другую скорость передачи данных.

Для этого необходимо подключить оба модуля (приемный и передающий) к компьютеру по очереди с помощью переходника USB-UART.

Подключив модули к компьютеру, необходимо установить соединение с последовательным портом, которое появится после подключения переходника USB-UART и выполнить следующие команды:

АТ

Если все соединено правильно - последует ответ:

АТ(OK)

В случае успешного получения ответа в вести команду:

АТ+ВХХХХХХ

Где ХХХХХХ - требуемое значение скорости последовательного порта (9600-115200).

В случае успешного выполнения команды получим ответ:

АТ+ВХХХХХХ(ОК)

Это означает, что модуль готов принимать информацию с порта Arduino на этой скорости.

Аналогичные действия для второго модуля, получим работающее радиосоединение. Теперь, введя на компьютере-получателе команду:

cat /dev/ttyUSB0

мы будем видеть строки, содержащие значения амплитуд по 16 полосам, измеренные передающим устройством на базе Arduino, выполняющим прошивку, описанную ранее (полный текст прошивки представлен в приложении).

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

Этот язык позволяет быстро разработать графический интерфейс пользователя, недостатком является плохая поддержка мультитрединга (как следствие этого, использование только одного ядра ЦП), что приводит к высокой загрузке. Результатом этого является высокое потребление электричества устройством, выполняющим код на Processing.

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

В простейшем случае, на котором мы остановимся, любым доступным способом выведем полученные с последовательного порта данные о спектре сигнала на монитор звукорежиссера (как вариант, для этого может использоваться еще одна плата Arduino, к которой может быть подключен LCD-дисплей).

Если есть необходимость проведения измерений в нескольких точках, можно использовать Arduino MEGA, которая имеет 4 последовательных порта. В случае необходимости использования более 4х портов, следует обратить внимание на библиотеку SoftwareSerial, которая позволяет использовать цифровые пины для реализации дополнительных последовательных портов. Подробно останавливаться на прошивке для такого случая не будем.

Заключение

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

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

Список используемой литературы

1. ВКР Жиляковой А.А. на тему «Автоматизированная система эквализации помещения»

2. http://www.instructables.com/id/Arduino-Audio-Input

3. kasus.ru/forums/showthread.php?t=107805

4. http://www.arduino.cc/

5. http://www.atmel.com/ru/ru/

Размещено на Allbest.ru

...

Подобные документы

  • Определение динамического диапазона источника звука и допустимого уровня шумов в помещении. Основное оборудование студий звукового вещания. Принцип действия и работу микрофона, применяемого в студиях для записи речи. Назначение генератора белого шума.

    контрольная работа [1016,3 K], добавлен 16.08.2014

  • Звуковая зкспликация выбранных эпизодов. Структурная схема соединения оборудования на площадке с учётом видео, звукового сигнала и сигнала синхронизации для каждых сцен. Обоснование выбора микрофонов, их характеристики, назначение в выбранных эпизодах.

    курсовая работа [1,4 M], добавлен 29.05.2014

  • Спектральные характеристики периодических и непериодических сигналов. Свойства преобразования Фурье. Аналитический расчёт спектра сигнала и его энергии. Разработка программы в среде Borland C++ Bulder 6.0 для подсчета и графического отображения сигнала.

    курсовая работа [813,6 K], добавлен 15.11.2012

  • Частотное преобразование акустического сигнала. Технические средства измерений, контроля и диагностики на основе ультразвуковых колебаний. Отражение и преломление звука. Прохождение звука через границу раздела двух сред. Разработка модуля программы.

    курсовая работа [1,0 M], добавлен 28.10.2011

  • Принципы определения граничных частот многоканального сигнала для заданных параметров. Особенности оценки линейного спектра сигнала спутниковой связи. Анализ уровня сигнала на входе приемника. Мощность тепловых шумов на выходе телефонной коммутации.

    контрольная работа [106,6 K], добавлен 28.12.2014

  • Создание компаратора и входного усилителя фильтра. Амплидно-частотная характеристика полосового фильтра. Разработка схемы преобразователя уровня и буфера. Осциллограммы моделирования работы такта преобразования гармонического сигнала в логический.

    курсовая работа [1,3 M], добавлен 26.01.2016

  • Построение графиков амплитудного и фазового спектров периодического сигнала. Расчет рекурсивного цифрового фильтра, цифрового спектра сигнала с помощью дискретного преобразования Фурье. Оценка спектральной плотности мощности входного и выходного сигнала.

    контрольная работа [434,7 K], добавлен 10.05.2013

  • Расчет спектральных характеристик сигнала. Определение практической ширины спектра сигнала. Расчет интервала дискретизации сигнала и разрядности кода. Определение автокорреляционной функции сигнала. Расчет вероятности ошибки при воздействии белого шума.

    курсовая работа [356,9 K], добавлен 07.02.2013

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

    курсовая работа [284,4 K], добавлен 29.09.2010

  • Определение практической ширины спектра сигнала. Согласование источника информации с каналом связи. Определение интервала дискретизации сигнала. Расчет вероятности ошибки при воздействии "белого шума". Расчет энергетического спектра кодового сигнала.

    курсовая работа [991,1 K], добавлен 07.02.2013

  • Схема цифрового канала связи. Расчет характеристик колоколообразного сигнала: полной энергии и ограничения практической ширины спектра. Аналитическая запись экспоненциального сигнала. Временная функция осциллирующего сигнала. Параметры цифрового сигнала.

    курсовая работа [1,1 M], добавлен 07.02.2013

  • Анализ структурной схемы системы передачи информации. Помехоустойчивое кодирование сигнала импульсно-кодовой модуляции. Характеристики сигнала цифровой модуляции. Восстановление формы непрерывного сигнала посредством цифро-аналогового преобразования.

    курсовая работа [2,6 M], добавлен 14.11.2017

  • Экспериментальное исследование принципов формирования АИМ – сигнала и его спектра. Методика и этапы восстановления непрерывного сигнала из последовательности его дискретных отсчетов в пункте приема, используемые для этого главные приборы и инструменты.

    лабораторная работа [87,1 K], добавлен 21.12.2010

  • Расчет энергетической ширины спектра сообщения. Показатели средней квадратической погрешности квантования. Кодирование значения дискретного сигнала двоичным блочным примитивным кодом. Спектр модулированного сигнала. Структурная схема системы связи.

    контрольная работа [1,6 M], добавлен 17.11.2012

  • Метод выделения огибающей АМ-сигнала при помощи преобразования Гильберта. Эквивалентная схема программного алгоритма. Способы выделения амплитудного огибающего сигнала. Синтез АМ-сигнала с несущей и боковыми частотами. Формирователь амплитудной огибающей.

    курсовая работа [279,1 K], добавлен 23.06.2009

  • Модуляция - процесс преобразования одного сигнала в другой, для передачи сообщения в нужное место, ее свойства, особенности и виды. Гармонические и импульсные переносчики. Демодуляция принятого сигнала. Спектр сигнала АИМ. Модуляция случайными функциями.

    реферат [124,2 K], добавлен 04.03.2011

  • Разложение непериодического сигнала на типовые составляющие. Расчет изображения аналогового непериодического сигнала по Лапласу. Нахождение спектральной плотности аналогового непериодического сигнала. Расчет ширины спектра периодического сигнала.

    курсовая работа [1,3 M], добавлен 13.01.2015

  • Расчёт ширины спектра, интервалов дискретизации и разрядности кода. Автокорреляционная функция кодового сигнала и его энергетического спектра. Спектральные характеристики, мощность модулированного сигнала. Вероятность ошибки при воздействии "белого шума".

    курсовая работа [1,0 M], добавлен 07.02.2013

  • Расчет параметров цифровой системы передачи, спектра АИМ-сигнала. Квантование отсчетов по уровню и их кодирование. Расчет погрешностей квантования. Формирование линейного сигнала. Разработка структурной схемы многоканальной системы передачи с ИКМ.

    курсовая работа [4,9 M], добавлен 08.10.2012

  • Определение интервалов дискретизации и квантования сигнала. Исследование характеристик кодового и модулированного сигнала. Согласование источника информации с каналом связи. Расчёт разрядности кода, вероятности ошибки в канале с аддитивным белым шумом.

    курсовая работа [917,1 K], добавлен 07.02.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.