c++ - Qt C++ 创建一个方形音频音波。播放并保存
问题描述
各位高手好,需要指导。我的情况是两部分。首先,我需要为使用 Qt C++ 指定的特定时间生成方波音频,我完全不知道从哪里开始。
其次,我还需要将音频导出为 .wav 或 mp3。我在某处读到需要在导出数据之前将 WAV 标头写入文件。我的第二个问题是如何将 QBuffer 中的音频导出到 wav 文件。
我在 Git 上找到了以下项目。然而,这只会产生正弦波而不是方波。 https://github.com/picaschaf/Soundgenerator
看这个项目中的功能
void QxtSoundGenerator::appendSound(qreal amplitude, float frequency, int msecs)
{
msecs = (msecs < 50) ? 50 : msecs;
qreal singleWaveTime = 1.0 / frequency;
qreal samplesPerWave = qCeil(format->sampleRate() * singleWaveTime);
quint32 waveCount = qCeil(msecs / (singleWaveTime * 1000.0));
quint32 sampleSize = static_cast<quint32>(format->sampleSize() / 8.0);
QByteArray data(waveCount * samplesPerWave * sampleSize * format->channelCount(), '\0');
unsigned char* dataPointer = reinterpret_cast<unsigned char*>(data.data());
for (quint32 currentWave = 0; currentWave < waveCount; currentWave++)
{
for (int currentSample = 0; currentSample < samplesPerWave; currentSample++)
{
double nextRadStep = (currentSample / static_cast<double>(samplesPerWave)) * (2 * M_PI);
quint16 sampleValue = static_cast<quint16>((qSin(nextRadStep) + 1.0) * 16383.0);
for (int channel = 0; channel < format->channelCount(); channel++)
{
qToLittleEndian(sampleValue, dataPointer);
dataPointer += sampleSize;
}
}
}
soundBuffer->append(data);
}
在项目中,您可以附加不同的频率,然后一个接一个地播放它们,这是完美的。它只需要一个方波。
有人可以给我建议,因为我在这方面的数学不是很好,或者帮助我理解这段代码,或者告诉我如何在 Qt C++ 中以这种方式创建方波。任何帮助将不胜感激。
解决方案
就像eyllanesc 提到的,您可以使用正弦波发生器并在低于零时使用最小值,在高于零时使用最大值。然而需要注意的一点是,这会产生一个简单的方波。这将有工件,因为您的值更改超过了 Nyquist 限制。为了获得更好的声音,您应该寻求创建一个带限的方波。通过将低于 Nyquist 的正弦波谐波相加来产生带限方波。
进一步阅读:
推荐阅读
- excel - 从超链接抓取 438 错误 VBA excel
- java - 无法编译 java 程序(注意:无法访问环境变量设置)
- amazon-web-services - 无法获取 Cognito 凭据的“经过身份验证的 id”
- php - Laravel 5.5,DB查询连接3张表,并按类别分组
- opengl - Opengl 和 Webgl:从附加到当前帧缓冲区的纹理中采样
- kotlin - 带有 Android Room TypeConverters 的 Kotlin 类型别名
- android-studio - Android studio 配置命令行属性
- command-line - 我们如何使用命令行在 Doxygen 中使用我的项目特定参数编辑生成的配置文件?
- django - 从Django视图传递参数到表单不起作用
- html - 我希望图标更进一步和平衡