在 Windows 上的 C++ 中生成运行时声音
Runtime Sound Generation in C++ on Windows
如何使用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
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 建议在运行时将带有类实例的列表从c++导入qml
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 读取文件时运行时的未知行为
- 函数在Windows或Linux上运行时表现不同
- 在声明中合并两个常量"std::set"(不是在运行时)
- 用C++在运行时生成声音
- 在 Windows 上的 C++ 中生成运行时声音
- Direct3D11在调试程序运行时发出声音