美好的一天专家,我需要指导。
我的情况分为两个部分。
首先,我需要在使用Qt C++指定的特定时间内生成方波音频,即使在哪里开始我也完全迷失了。

其次,我还需要将音频导出到.wav或mp3。
我读过某个地方,在导出数据之前,需要将WAV header 写入文件。我的第二个问题是如何将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一样,您可以使用正弦波发生器,并在零以下时使用最小值,在零以上时使用最大值。但是要注意的一件事是,这将产生幼稚的方波。这将产生伪影,因为您进行的值更改超出了奈奎斯特限制。为了获得更好的声音,您应该寻求创建频带受限的方波。通过将低于奈奎斯特的正弦波谐波相加产生带限方波。

进一步阅读:

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

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

关于c++ - Qt C++创建方波音频波。播放并保存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51239074/

10-10 08:12