2015-06-28 1 views
3

Пытается генерировать квадрат, пилу и грех wav в коде, а затем сохранять в файл AIFF на основе учебного ядра Chris Adam книга. У меня это работает, но я смущен тем, почему мне не нужно преобразовывать образец в .bigEndian в Swift, но вам нужно в Obj-C?Создание квадрата, пилы и синуса Образец и запись в файл AIFF - проблемы с большим концом

Вот что рабочий код в Obj-C выглядит следующим образом:

SInt16 sample = CFSwapInt16HostToBig (((i/wavelengthInSamples) * 
SHRT_MAX *2) - SHRT_MAX); 

Вот что рабочий код в Swift2 выглядит следующим образом:

var sample = Int16(((Double(i)/wavelengthInSamples) 
* Double(Int16.max) * 2) - Double(Int16.max)) 

Вот что Свифт площадка график выглядит, как если бы я оставь .bigEndian swift playground saw wave

Если добавить .bigEndian после преобразования в Int16() и отправить AudioFileWriteBytes, сгенерированный аудио не звучит правильно:

var sample = Int16(((Double(i)/wavelengthInSamples) 
* Double(Int16.max) * 2) - Double(Int16.max)).bigEndian 
AudioFileWriteBytes(audioFile, 0, Int64(sampleCount * 2), &bytesToWrite, &sample) 

Full source here: https://gist.github.com/justinlevi/7a846070ee6e7e245cc3

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

Развейте вопрос: Почему бы меандр быть Су гораздо спокойнее по сравнению с пилой или грех волны?

ИСТОЧНИК: Адамсон, Крис; Авила, Кевин (2012-04-03). Learning Core Audio: практическое руководство по программированию звука для Mac и iOS (Kindle Locations 1063-1073). Образование Пирсона. Kindle Edition.

+0

в Swift версии, если вы не добавите '.bigEndian' и вы пишете аудиофайл, это звучит правильно? – fqdn

+0

Да, если я НЕ добавляю '.bigEndian', то волна звучит правильно, но это мой вопрос. Зачем вам нужно преобразовать образец в .bigEndian в Obj-C, но не в Swift? Особенно, когда AIFF требует больших образцов Endian. –

+0

Это довольно интересно, каждый признак состоит в том, что вам нужно преобразовать в big-endian, weird ... re: аудиофайл, который выводится, используя ваш gist, я не мог заставить его написать файл, который можно было открыть по Quicktime или Logic ... если у вас есть минута, чтобы сделать это, можете ли вы обновить свой текст, чтобы написать полный файл? Мне интересно видеть результирующий сигнал, когда он открывается в редакторе - спасибо! – fqdn

ответ

0

Тьфу ... @jaybers полностью заставил меня понять, что AIFF файлы были написаны в LittleEndian поэтому графики выглядели так. Я видел эти графики на игровой площадке, когда я добавил .bigEndian на образец. Я обновил проект github выше, и теперь все выглядит так, как ожидалось. Квадратная волна также столь же громкая, как и другие образцы ...

Big Endian AIFF Graphs

Вот новые аудио файлы с .bigEndian преобразования.

1

Для вашего последующего вопроса средняя среднеквадратичная мощность квадратной волны выше, чем синусоидальная волна. Квадратная волна проводит большую часть своего времени с максимальной амплитудой пика. См. wikipedia и stack exchange для получения дополнительной информации.

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

enter image description here

+0

О, это действительно интересно на самом деле. Я не думал проверять осциллограммы в Audicity после рендеринга ... Интересно отметить, что волны, появляющиеся в Audicity, именно то, что я вижу на игровой площадке, когда я добавляю .bigEndian к образцу. –