Mac OS X: смещение частоты звука при изменении частоты дискретизации?
Я хочу изменить частоту записи голоса, изменив частоту дискретизации в Mac OS X.
Это исследовательский проект, предназначенный для людей, которые заикаются. Важно, чтобы задержка была очень низкой - вот почему я не рассматриваю быстрые преобразования Фурье. Вместо этого я хочу собирать образцы с частотой, скажем, 44 кГц, а затем выполнить одно из двух:
1) Воспроизведите сэмплы в два раза медленнее (например, 22 кГц). Это приведет к увеличению асинхронности с источником. Было бы полезно, если бы я мог перезапускать выборку каждые 1 секунду или около того, чтобы асинхронность не стала слишком заметной.
2) Воспроизведите сэмплы в два раза быстрее. Очевидно, что это невозможно делать непрерывно (то есть нельзя воспроизводить сэмплы, которые еще не были собраны). Чтобы обойти это, я намерен остановить воспроизведение квадратной волной. Сэмплы будут воспроизведены в два раза быстрее, чем они были записаны во время пика прямоугольной волны. Ничто не будет слышно (но образцы все еще будут собираться) во время впадины прямоугольной волны.
Я подготовил PDF, который описывает проект более подробно здесь:
https://www.dropbox.com/s/8u3tz7d9hhxd3t9/Frequency%20shift%20techniques.pdf?dl=0
Друг помог мне с некоторыми из программирования для этого с помощью PortAudio. К сожалению, у нас очень большие задержки. Я думаю, что это может быть потому, что PortAudio работает на слишком высоком уровне. Из кода мне кажется, что PortAudio буферизирует входящий аудиопоток, а затем вносит изменения, которые prima facie похожи на те, что я описал выше, но которые на самом деле являются операциями над буферизованным потоком.
Это совсем не то, что я хочу. Очень важно, чтобы процессор делал как можно меньше. Ссылаясь на условия (1) и (2) выше, все, что нужно сделать компьютеру, это (1) воспроизвести семплы без каких-либо манипуляций, но в два раза медленнее; или (2) сохранить входящие сэмплы, а затем воспроизвести их в два раза быстрее. Никакой другой обработки не должно быть. Я думаю, что это единственный способ получить очень низкие задержки, которые я ищу.
Я задавался вопросом, будет ли лучше попробовать сделать это непосредственно в Core Audio для OS X, а не использовать PortAudio? Это ограничит совместимость платформы. Но низкая задержка гораздо важнее, чем совместимость.
Могу ли я быть в состоянии делать то, что я хочу, используя услугу среднего уровня, такую как Аудиоустройства? Или мне нужно написать напрямую для низкоуровневого сервиса, такого как I/O Kit? Как бы я пошел по этому поводу?
1 ответ
Похоже, вам лучше всего использовать что-то вроде Max/MSP или Pure Data. Это позволит вам избежать работы с текстовыми языками и поможет вам быстро развить то, что вы хотите сделать. Комплект ввода / вывода слишком низкоуровневый для того, что вы пытаетесь сделать.
Поскольку max не является языком, основанным на тексте, совместное использование самого кода немного сложно на сайтах, таких как переполнение стека. Я включил скриншот. Вы можете скопировать и вставить максимум кода, но это немного уродливо и неуместно для этого.
вот краткое описание. Окно с надписью rect~ 1 генерирует прямоугольную волну в Гц. Снимок ~ блок захватывает значения, которые это выплевывает. Боксы if проверяют, когда он больше нуля или меньше нуля (пики и впадины). Если он получает впадину, блок записи ~ записывает сигнал от блока микрофона и сохраняет его в буфере. блок groove ~ box - это сэмплер, который воспроизводит аудио в этом буфере, когда он получает удар от блока if, он воспроизводит аудио. Сиг-бокс используется для управления скоростью воспроизведения.
Кроме того, вы можете не знать об этом, но.PDF, которым вы пытаетесь поделиться, недоступен.
Еще одна вещь, если задержка важна, вы должны узнать о чем-то, что называется клик-поездом. Это в основном то, где вы отправляете сигнал с одиночной 1 в начале и временем, которое требуется для того, чтобы это значение прошло через вашу систему.