【发布时间】:2018-07-09 06:04:42
【问题描述】:
各位专家,我需要指导。 我的情况是两部分。 首先,我需要为使用 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++ 中以这种方式创建方波。任何帮助将不胜感激。
【问题讨论】:
-
见
qSin(nextRadStep) + 1.0。 :) -
除非我误解了您的建议,否则尝试使用
qSin(nextRadStep) + 1.0不会产生声音。我完全迷失在数学中 -
你想让别人做他们的工作吗?然后雇佣一个人,这就是产生正弦波的部分,你应该阅读一些愚蠢的数学并尝试将其转换为正弦波到平方: 试试
quint16 sampleValue = static_cast<quint16>((qSin(nextRadStep)> 0 ? 1 : 0)*32767); -
抱歉,我无意冒犯,我只是想学习,我发现这个特定问题有点令人困惑。我找错地方了,以为是 M_Pi 负责创建波浪。根据你的最后一个建议,它似乎产生了一个方波。我删除了 * 32767,这就是它没有产生任何音频的原因。谢谢你帮助我。
标签: c++ qt math audio waveform