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(), '');
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提到的,你可以使用正弦波发生器,在低于零时使用最小值,在高于零时使用最大值。然而,需要注意的一件事是,这将产生一个朴素的方波。这将有伪影,因为您的值更改高于奈奎斯特极限。为了获得更好的声音,您应该寻求创建一个带限方波。带限方波是通过将低于奈奎斯特的正弦波谐波相加而产生的。

延伸阅读:

奈奎斯特:https://en.wikipedia.org/wiki/Nyquist_rate

波段限定方波:https://www.nayuki.io/page/band-limited-square-waves

最新更新