gpt4 book ai didi

c++ - 精确的信号发生器

转载 作者:太空宇宙 更新时间:2023-11-04 11:52:13 25 4
gpt4 key购买 nike

我想在 Qt 中创建一个精确的信号发生器。

例如,10us(微秒)生成 255 而 10ms(毫秒)生成 0 的方波信号。

我在我的线程中使用 usleep() 但它休眠了大约 1 毫秒!!当搜索它时,我发现它用于 CPU 上下文切换。

//fp:frequency of signal //t:time of generate high (amp) // n:generate n time

void Thread::rectGenerator(double fp, double t, double amp, double n)
{
double result;
double T=1000000/fp; //(us)
for (double i=0,ii=0; i<n*T; i+=_Interval,ii+=_Interval)
{
if (ii>=T)
ii=0;
if (ii<=t)
result=amp;
else
result=0;
th.usleep(1);
qDebug() << i << "\t" <<result;
}
}

结果:rectGenerator(200, 20, 255, 12) 在 12 秒内执行,但它应该在 60(ms) 内执行!!!

So what is the best way to generate accurate signal ?

最佳答案

通常情况下,您要做的是分配一个代表一定时间量的缓冲区,用您生成的信号填充此缓冲区,然后安排播放、保存或流式传输。 (你没有指定你对信号做了什么,但由于你是用线程做的,我假设它是近似实时的)。

假设您的目标采样率为 48kHz(专业音频标准)。然后,您将分配一个包含 48000 个浮点样本的缓冲区来存储 1 秒的音频。 (使用 double 几乎肯定是矫枉过正;高质量音频是 16 位或 24 位,如果您掌握顶级系统,则为 32 位,所以 float 已经足够精确;double 是在浪费位)。

然后您将使用与您在上面粘贴的内容非常相似的循环函数,用您的信号填充此缓冲区。但是您不使用 sleep 或类似的东西;现在,您只准备稍后播放的数据。

因此,一旦准备好音频缓冲区,就需要安排播放时间。这通常涉及您将缓冲区发送到系统以在特定时间播放。根据 API 或设备,当达到低水位线等时,您将收到一个回调以填充缓冲区。

如果您的信号永远不会改变,您可以只生成一个缓冲区并通过重新安排播放来继续重复使用它。根据信号的周期,您可能需要调整缓冲区大小以保持正确的频率。

(请注意,您所描述的纯方波理论上需要无限带宽才能重现,具有砖墙边缘;您可能应该应用低通滤波器来限制信号的带宽,这取决于您的输出设备。)

关于c++ - 精确的信号发生器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17673820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com