После немного возиться с portaudio
в свободное время я пытался передать частоту, когда микрофон открыт, для этого я написал обратный вызов — обратный вызов открывается только
выходной поток и затем я использую функцию обратного вызова записи portaudio. Если формат образца для вывода определен как paFloat32
ничего не слышно, но если я определю это paUInt8
и количество каналов 1, поэтому я слышу звук (например, звуковой сигнал), но определение высоты звука (с использованием БПФ) не совпадает с частотой, которую я передаю.
Поэтому мой вопрос заключается в том, что БПФ неправильно реализовано (или — возможно ли использовать paUint8 и все же получить правильный ответ) или мне следует попробовать использовать блокировку ввода-вывода?
некоторый код (возможно, это поможет):
это выходные параметры для выходного потока (входной поток взят из примера записи).
outputParameters.device = Pa_GetDefaultOutputDevice();
outputParameters.channelCount = 1;
outputParameters.sampleFormat = paUInt8;
outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
outputParameters.hostApiSpecificStreamInfo = NULL;
P.S: Любые объяснения, почему можно передавать с paUInt8
хотя я использовал 2 обратных вызова (1 для чтения и один для записи).
Невозможно знать, где проблема, без большего количества кода, но я могу сказать несколько вещей:
Переход к блокировке не будет иметь никакого значения для решения вашей проблемы.
Если вы ничего не слышите, когда делаете paFloat32, вы, вероятно, делаете что-то не так, потому что поддержка paFloat32 чрезвычайно хороша. Тип с плавающей точкой имеет диапазон от -1 до 1. Убедитесь, что это то, что вы выводите. Вы также можете попробовать некоторые из замечательных примеров кода, включенных в PortAudio. Найдите тот, который выводит, используя paFloat32, используя обратные вызовы, и посмотрите, работает ли он (например, этот).
Если вы получаете неправильную высоту звука при обнаружении БПФ, вы, вероятно, также делаете это неправильно. Есть две возможности: 1. высота тона не такая, как ты думаешь, и 2. твое определение высоты тона FFT неверно. Без кода я могу только догадываться, но, поскольку у ВСЕХ есть проблемы с №2 (судя по вопросам о SO), я предполагаю, что у вас есть проблемы по крайней мере с этим.
Для определения высоты тона FFT проверьте мою запись в блоге с кодом (в ней даже используется portaudio)
http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html
Для создания правильного тона здесь есть много вопросов о SO.
Других решений пока нет …