问题:
我正在开发一个图像采集的应用,需要知道图像采集所需要的带宽,应该如何来计算每秒钟我采集的数据大小呢?
解答:
当考虑图像采集所需要的带宽时,我们需要考虑两种数据传输速率:瞬时速率和平均速率。下面就向大家来详细介绍这两种速率的概念以及他们的计算方法,同时在本文的最后为大家提供了一个案例。
- 瞬时数据传输速率
数据传输速率中最重要,最需要考虑的就是瞬时数据传输速率。它是指相机将数据流向采集卡的传输速率,它是由相机的像素时钟速率所决定的。如果该速率过高,采集卡就不能够将相机的图像及时有效地从总线上取走,导致缓冲区溢出的错误。
计算瞬时数据传输速率,需要知道:
• 像素深度 (bytes/pixel)*
• 相机的像素时钟速率 (in MHz)
• 拍数(The number of taps)
*10 & 12 比特的图像在内存中占据16比特的宽度。
使用下面的公式来计算瞬时数据传输速率:
瞬时数据传输速率 (MB/s) = 像素时钟速率(MHz) x 像素深度(Bytes) x 拍数
一旦我们知道瞬时数据传输速率,我们就可以判断我们的硬件是否能够应付图像采集的任务。如果图像采集卡的数据吞吐量大于瞬时数据传输速率,那么我们就不会得到缓冲区溢出的错误。
如果采集卡的吞吐量小于瞬时数据传输速率,那么我们就需要考虑板载FIFO的填充速率了。如果一帧图像还没有采集完成FIFO就已经溢出,我们同样会得到一个缓冲区溢出的错误,即便我们只是采集一帧图像。
使用下面的公式来计算FIFO的填充速度:
FIFO填充速度(MB/s) = 瞬时数据传输速率 - 采集卡总线吞吐量
我们同时需要知道从相机采集一帧图像所需要的时间。该参数会随着相机的帧速率而改变,但它是由相机的时钟速率来决定的:
帧时间 (s/frame) = 分辨率 / (拍数 x 像素时钟速率)
我们可以通过FIFO填充速率和帧时间来确定每帧图像所需要的FIFO大小:
FIFO大小 = FIFO填充速率 x 帧时间
- 平均数据速率
平均数据速率是指软件从相机接收一整帧图像的速率,它是由帧速率来决定的。如果像素帧太大而导致在指定的时间内数据不能从总线上传输到软件中,那么我们会得到一个采集超时的错误。
计算平均数据速率,你需要知道如下参数:
• 图像的分辨率
• 像素深度 (bytes/pixel)
• 帧速率 (Hz)
使用下面的公式来计算每秒钟采集的数据大小:
-
长 x 宽 = 分辨率 (像素)
-
分辨率 x 像素深度 = 字节数/帧
-
字节数/帧 x 帧速率 = 字节数/秒
注意: 该值应该在106 量级,或者MB/s。
案例:
我要使用PCIe-1427图像采集卡来采集一个1280x1024 12-bit 的图像,帧速率为10 fps (frames per second)。我的相机速率为80 MHz,采集卡的接口为1x PCIe接口,采集时配置的拍数为2,我能够顺利的采集一帧图像吗?
注意:PCIe-1427板载的内存有16 KB,1x PCIe插槽最大的数据吞吐量为 200 MB/s.
- 计算瞬时数据传输速率:
80M pulses/s x 2 pixels/pulse x 2 Bytes/pixel = 320 MB/s
因为 320 MB/s > 200 MBs,所有我们需要将数据缓存到板载的FIFO上面。 - 计算FIFO的填充速率:
320 MB/s – 200 MB/s = 120 MB/s - 计算帧时间:
(1280 pixels/line x 1024lines/frame) / (2 pixels/pulse x 80 pulses/s) = 8.2e-3 s/frame - 计算所需的FIFO大小:
120 MB/s x 8.2e-3 s/frame = 984 KB/frame
因为所需要的FIFO大于板载的内存大小(984 KB > 16 KB),所以我们不能够有效的采集一帧图像,同时会在采集过程中得到一个缓冲区溢出的错误。