对 QtCreator C++ 生成的正弦波信号进行剪辑

问题描述 投票:0回答:1

亲爱的!

我正在使用QtCreator创建一个项目,这个项目是一个正弦波发生器,比如60到83.3Hz的正弦波发生器。

我使用示波器观察这个信号,我使用 RaspBerry pi 5 的输出音频作为该信号的输出发生器。

但是,当我尝试生成 83.3 Hz 信号时,它会出现类似“削波”的情况,从 100 毫秒到 100 毫秒,呈周期性。如果我尝试管理其他频率,代码运行得很好,就在我使用 83.3 时出现了这个问题。

我使用 QtCreator 和 Raspberry Pi 5 的音频输出来创建此项目。很简单。

感谢您的支持! =D

按照以下代码中的磁带进行操作:

void MainWindow::gerador_frequencia(int frequency)
{
    stopSignal();

    qDebug() << "Gerando sinal de" << frequency << "Hz";

    int sampleRate = 44100; 

    QAudioFormat format;
    format.setSampleRate(sampleRate);
    format.setChannelCount(1);
    format.setSampleFormat(QAudioFormat::Int16);

    QAudioDevice audioDevice = QMediaDevices::defaultAudioOutput();

    audioSink = new QAudioSink(audioDevice, format, this);
    audioIODevice = audioSink->start();

    audioBuffer = generateSineWave(frequency, format.sampleRate(), 100);  // 100 ms de áudio por vez

    audioTimer = new QTimer(this);
    connect(audioTimer, &QTimer::timeout, this, &MainWindow::onAudioNotify);
    audioTimer->start(100);  // Enviar novos dados a cada 100 ms para garantir reprodução contínua

    // Timer para parar automaticamente após 3600000 msegundos
    stopTimer = new QTimer(this);
    connect(stopTimer, &QTimer::timeout, this, &MainWindow::stopSignal);
    stopTimer->setSingleShot(true);
    stopTimer->start(3600000);  // Parar após 1h

    qDebug() << "Frequencia gerada com sucesso!!!";
 
    } // fim da void

    QByteArray MainWindow::generateSineWave(int frequency, int sampleRate, int durationMs) 
    {
    double sampleCount = (sampleRate * durationMs) / 1000;
    QByteArray buffer(sampleCount * sizeof(int16_t), 0);
    int16_t *data = reinterpret_cast<int16_t*>(buffer.data());

    double amplitude = 16000;  // Amplitude ajustada para evitar clipping
    double angleIncrement = (2.0 * M_PI * frequency) / sampleRate;

    for (int i = 0; i < sampleCount; ++i) {
        data[i] = static_cast<int16_t>(amplitude * sin(i * angleIncrement));
    }
    return buffer;
    }

我尝试更改变量的类型,例如 int、double 等..但它不起作用...并且我也尝试更改样本到音频输出的时间...什么也没有发生...

c++ audio cmath
1个回答
0
投票

亲爱的!感谢您的支持!我已经完成了这个问题,83.3Hz,每个缓冲器 100ms 有 8,3 个周期,或者每个波周期 12.04ms。然后,8.3 个周期的 0.3 就是问题,我需要一个完整的数字用于缓冲区,而不是十进制数...0.3 不是一个完整的波,它是一个周期的 30%。为了解决这个问题,我只使用了 8 个周期的缓冲区,保持波的周期 83.3 (12.04ms),为此,我的新缓冲区时间是 96.38ms!恢复:对于其他int频率,如60、80、90、100hz,我可以使用100ms作为缓冲。但是,对于小数频率,例如 83.3,我需要使用 96.38ms 或 (int Cycle/period = 8/12.04 = 96,38)。目前,它的工作非常好=D enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.