在 Windows 上的 C++ 中生成运行时声音

Runtime Sound Generation in C++ on Windows

本文关键字:运行时 声音 Windows 上的 C++      更新时间:2023-10-16

如何使用C++在运行时生成音频?我只是在寻找一个起点。论坛上有人建议我尝试让程序播放给定频率和振幅的方波。

我听说现代计算机使用 PCM 样本对音频进行编码:在特定时间单位(例如 48 kHz(的给定速率下,以给定的分辨率(例如 16 位(记录声音的振幅。如果我生成这样的样本,如何让我的扬声器播放它?我目前正在使用窗口。如果可能的话,我宁愿避免使用任何其他库,但我会满足于一个非常轻的库。

以下是我使用此原理生成方波样本的尝试:

signed short* Generate_Square_Wave(
    signed short a_amplitude , 
    signed short a_frequency ,
    signed short a_sample_rate )
{
    signed short* sample = new signed short[a_sample_rate];
    for( signed short c = 0; c == a_sample_rate; c++ )
    {
        if( c % a_frequency < a_frequency / 2 )
            sample[c] = a_amplitude;
        else
            sample[c] = -a_amplitude;
    }
    return sample;
}

我这样做是否正确?如果是这样,我该如何处理生成的样本才能让我的扬声器播放它?

循环必须使用 c <a_sample_rate以避免缓冲区溢出。>

要输出您称为 waveOutOpen 和其他 waveOut...功能。它们都列在这里:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd743834(v=vs.85(.aspx

你使用的代码产生的波是真正的正方形,二进制的平方,简而言之,现实生活中不存在的波形类型。实际上,您听到的大多数(几乎可以肯定的所有(声音都是不同频率的正弦波的组合。

由于您的样本是按原样创建的,因此它们会产生混叠,其中较高的频率伪装成较低的频率,从而导致音频伪影。为了向自己演示这一点,请编写一个小程序,将代码的频率从20-20,000hz扫描。您会听到声音在频率提高时不会平稳上升。你会听到人工制品。

维基百科有一篇关于方波的优秀文章:https://en.m.wikipedia.org/wiki/Square_wave

生成方波的一种方法是执行逆快速傅里叶变换,将一系列频率测量值转换为一系列基于时间的样本。然后生成方波就是向例程提供构成方波的不同频率的正弦波测量值的集合,输出是具有单个波形周期的缓冲区。

生成音频波的计算成本很高,因此通常要做的是生成音频样本数组并以不同的速度播放它们以播放不同的频率。这称为波表合成。

请看以下链接:

https://www.earlevel.com/main/2012/05/04/a-wavetable-oscillator%E2%80%94part-1/

以及更多关于信号的频带限制以及为什么有必要:

https://dsp.stackexchange.com/questions/22652/why-band-limit-a-signal