精确的信号发生器
Posted
技术标签:
【中文标题】精确的信号发生器【英文标题】:Accurate Signal Generator 【发布时间】:2013-07-16 10:12:42 【问题描述】:我想在 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) 内执行!!!
那么生成准确信号的最佳方法是什么?
【问题讨论】:
这与 Qt 不太相关(更多的是一个通用的 c/c++ 问题)。在循环中使用 qDebug() 会扭曲你的结果。 是的。你说得对,我改了 ;) 【参考方案1】:通常您要做的就是分配一个代表一定实时时间的缓冲区,用您生成的信号填充此缓冲区,然后安排播放、保存或流式传输。 (你没有具体说明你对信号做了什么,但由于你是用线程做的,我假设它是近似实时的)。
然后假设您的目标采样率为 48kHz(专业音频的标准)。然后,您将分配一个包含 48000 个浮点样本的缓冲区来存储 1 秒的音频。 (使用 double 几乎可以肯定是矫枉过正;高质量的音频是 16 位或可能是 24 位,如果您掌握***系统,则为 32 位,因此 float 精度绰绰有余; double 浪费位)。
然后您将使用与您在上面粘贴的内容非常相似的循环函数用您的信号填充此缓冲区。但是你不使用 sleep 或类似的东西;目前,您只是准备稍后播放的数据。
因此,一旦准备好音频缓冲区,就需要安排播放它。这通常涉及您将缓冲区发送到系统以在特定时间播放。根据 API 或设备,当达到低水位线时,您将收到一个回调来填充缓冲区,等等。
如果您的信号永远不会改变,您可以只生成一个缓冲区并通过重新安排播放来继续重复使用它。根据信号的周期,您可能需要调整缓冲区大小以保持正确的频率。
(请注意,您描述的纯方波理论上需要无限带宽才能再现,其砖墙边缘;您可能应该应用低通滤波器来限制信号,这取决于您的输出设备。)
【讨论】:
是的。信号是实时的,我想生成 2-60 分钟。但我的信号不是音频信号,其精度为 5 微秒。我想我无法得到答案! 好的,那么您需要更具体地了解您的设置,尤其是硬件接口。如果不是音频,那么您在驱动什么样的输出?有了更多详细信息,我将能够根据您的情况更新我的答案。 解决您的其他 cmets:持续时间并不重要。您只需要使用您的周期信号生成一个短缓冲区,然后只需使用您的硬件驱动程序不断地重新安排它以进行输出。有几家高端音频产品制造商生产具有 192kHz DAC 的卡,这将超过这种精度。例如digigram.com/products/… 和m-audio.com/products/en_us/Audiophile192.html。 我想在 Qt 中生成一个信号,然后在装有 winCE 的“mini6410 board”上运行它。我认为板子并不重要,我应该在笔记本电脑上编写正确的程序,然后用合适的函数替换代码中的 qDebug()。 所以您想将此信号从您的笔记本电脑发送到您的 mini6410 板上吗?使用什么样的界面?还是你想让 mini6410 产生这个信号?【参考方案2】:对于 10 uS 范围内的精度,最好将信号生成卸载到专用硬件(FPGA 或具有实时或无操作系统的微控制器)。
【讨论】:
这仍然比 44.1k 或 48kHz 的音频采样率高出 2 倍以上,而且大多数非实时计算机需要缓冲一堆音频样本才能跟上。【参考方案3】:由于您需要 100 Khz 信号,到目前为止,最简单的解决方案是使用专为创建该范围内的信号而设计的设备。一个好的声卡will achieve this 并且很容易编程。只需加载您的样本并告诉它播放。它的内部硬件将完成所有计时。
【讨论】:
以上是关于精确的信号发生器的主要内容,如果未能解决你的问题,请参考以下文章