亲爱的!
我正在使用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 等..但它不起作用...并且我也尝试更改样本到音频输出的时间...什么也没有发生...
亲爱的!感谢您的支持!我已经完成了这个问题,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