2013-08-27 2 views
1

Хорошо, поэтому у меня есть небольшая программа, в которой пользователь может управлять выходной частотой аудиосигнала и воспроизводить песни (теоретически :)).Вывод звука (Windows Audio API) - низкие частоты тихие

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

for (int k = 0; k < points_sine_wave; k++) 
     { 
      // Generate sine wave 
      sineWave[k] = pow(2.0,10) * (sin(2*3.14159*f*td*k + old_angle) + 1); 

     } 

td является delta t (постоянным), f является частотой, k является просто индексом. Чтобы обеспечить непрерывность синусоидальной волны при изменении частоты, я использую old_angle, который сохраняется, чтобы запомнить, с какого угла можно возобновить. Я проверил генерируемые здесь колебания, и он работает (синусоида остается непрерывной, но меняет частоту). +1 должен сделать все положительным.

Теперь, в зависимости от того, что я положил в эту полосу (2.0, x), я не могу слышать низкие частоты. Кажется, что в 2^7, я могу слышать все просто отлично (100 Гц - это что-то интересное), но если я перейду к 2^6 или 2^5, я больше не слышу низкочастотную частоту.

Я посмотрел на свой результат через Audacity и заметил, что высокочастотные компоненты всегда занимают весь вертикальный диапазон (от -1 до 1), а низкая частота - от -0,4 до 0,4.

Почему? Сигнал, который я пишу в буфер, имеет одинаковую максимальную амплитуду (проверен в Matlab - может опубликовать это, если хотите).

Формат установлен на PCM, число бит равно 32, а число допустимых бит равно 32 (хотя 32, похоже, все рельсы).

ответ

1

Наиболее вероятный ответ заключается в том, что динамики, которые вы воспроизводите, не очень хороши при воспроизведении низких частот. Настольные компьютерные колонки, например, часто won't produce sounds below 50Hz. Если у вас есть сабвуфер или действительно высококачественные динамики, конечно, вы сделаете лучше.

Другая возможность - это, конечно, что-то не так с синусоидальной волной, которую вы генерируете ... но в целом это было бы очевидно в Audacity, если бы вы приближались достаточно близко, чтобы увидеть отдельные образцы. То есть, если визуальное изображение выглядит как правильная синусоидальная волна, то это, скорее всего, является правильной синусоидальной волной. (и если это не так, например, если есть какие-либо внезапные разрывы, вы услышите очень очевидный шум в звуке при воспроизведении!)

Последнее примечание. Предполагая, что ваш формат PCM использует подписанные значения образца, я подозреваю, что вы 'будет лучше, если вы держите свою синусоидальную волну вертикально по оси X; то есть с равным числом положительных и отрицательных значений. Если вы сохраняете все значения положительными, то ваши динамики будут воспроизводить звук с смещением по постоянному току, что может быть плохим (или, по крайней мере, субоптимальным) для various reasons.

+0

Я бы поставил на последнюю проблему. Тот факт, что Audacity не показывает смещение по постоянному току, означает, что он должен быть передан через какой-либо фильтр, возможно преобразование D/A-A/D. Снимите «+ 1». «32 бита, похоже, все рельсы» - еще один показатель той же проблемы. 32 бит PCM имеет амплитуду 31 бит, потому что для знака необходим один бит. Игнорируйте это, и у вас неприятное переполнение, возможно, обертывание до отрицательных значений. Если вы используете синусовую кривую от 1,9 миллиарда до 2,0 до 2,1-2,1 и до 2,1, у вас очень неприятный громкий щелчок. – MSalters

+0

Спасибо, я думаю, вы были правы относительно смещения постоянного тока, которое я ему давал. Я удалил «+1», и теперь он работает! – Mewa

0

У вас есть 31 бит возможной амплитуды и используйте 2^7 или 2^6 в качестве фактической амплитуды? Существует много звуковых карт, которые могут выполнять только 24 бита. Фактически, 16 бит не считаются ужасно плохими.