我是 DSP 新手?开源 DSP 算法的好资源在哪里?
MATLAB 擅长制作原型,但一旦我们转向 C 编码,这需要时间,而且我们最终会犯太多错误。我猜想对于过滤器等的各种实现必须有很好的 C 代码存储库。任何指针都会很好。
我是 DSP 新手?开源 DSP 算法的好资源在哪里?
MATLAB 擅长制作原型,但一旦我们转向 C 编码,这需要时间,而且我们最终会犯太多错误。我猜想对于过滤器等的各种实现必须有很好的 C 代码存储库。任何指针都会很好。
问题是 ANSI C 对于实时 DSP 来说并不是一种非常好的语言。真实 DSP 芯片的许多特性无法在 ANSI C 中解决。这些特性包括地址生成器、位反转寻址、循环寻址、SIMD、内存段、多总线、小数数据类型、小数乘法、某些定点数学、零开销循环等。因此,大多数 DSP 编译器具有广泛的语言扩展集(#pragma、内联汇编器、新关键字等)。然而,这些显然是非 ANSI 且不可移植的。
在 ANSI C 中编写一个简单的定点 FIR 滤波器的效率很容易比使用适当的扩展或汇编代码低 10 倍。
第 1 部分:关于比较:
对于什么是 Matlab 的更快替代方案,没有很好的通用答案。这完全取决于您使用的平台。
@Hilmar asnwer 表示 SIMD 等功能 - 在 C 中是可能的。但它需要与 C 一起支持汇编语言。
这是一个更广泛的比较:
如果您正在从事通用计算(如 x86 或 PPC),我想没有什么比 C 更好(更快)的了。
如果您正在使用专门的 DSP 硬件(或嵌入式平台,如 ARM),那么原生汇编将遥遥领先,而 C 可能无法与之匹敌。(尽管 C 可能是制作灵活软件与执行速度之间的正确平衡。
如果您将 C 与 C++ 进行比较,与一般看法不同 - 在大多数情况下,C++ 可以通过一些更好的编程特性来优化。
对于其他方便的工具 - 您可以查看其他一些脚本工具,例如 TCL 或 Lua。这些肯定比较低级别要好,但可能会影响速度。
第 2 部分:参考文献
我猜想对于过滤器等的各种实现必须有很好的 C 代码库。
OpenCV - 可能最适合计算机视觉应用。
ImLab 2.3 - 是用于科学图像处理的免费开源图形应用程序,可在 Windows、Linux 和许多其他 UNIX 系统中运行。它支持多个窗口,数据类型包括 32 位整数、32 位实数和复数。它是用 C++ 和 C 实现的,以提供一种非常简单的方法来添加新功能。它具有许多图像操作并支持多种文件格式。
ImageLib:是一个提供图像处理和相关设施的 C++ 类库。主要的类集提供了各种图像和矢量类型,以及支持标量和矢量量化、小波变换、DCT 变换和简单直方图操作的附加模块。
CImage - C++ 模板图像处理库
Camellia Library是一个开源的图像处理和计算机视觉库。用纯 C 语言编写,它是跨平台的(Unix / Linux、Windows)和健壮的。它已经包含了很多图像处理功能(过滤、形态数学、标签、变形、绘图、项目/反向项目、颜色转换、加载/保存图像等),其中大部分都经过了高速优化。它也有 doxygen 文档,并提供了使用示例。
VXL:用于计算机视觉研究和实现的 C++ 库
GNU Scientific Library (GSL)是一个面向 C 和 C++ 程序员的数值库
英特尔® 数学内核库(英特尔® MKL)是一个计算数学库,其中包含高度优化、广泛线程化的数学例程,适用于需要最高性能的应用程序。核心数学函数包括 BLAS、LAPACK、ScaLAPACK1、稀疏求解器、快速傅里叶变换、矢量数学等。
您可以参考这本书:Numerical Recepies in C - 和示例代码。
您可以检查放置 matlab 编码器产品。这使您可以直接从您的 matlab 代码生成 C 代码,而不必担心引入人为错误。
http://www.mathworks.co.uk/products/matlab-coder/?s_cid=HP_MI_matlabcoder
但是,它仅支持该语言的一个子集并且需要单独的许可证,但它可能适合您的需求。
以下链接可用于查找受支持的函数子集
http://www.mathworks.co.uk/help/toolbox/eml/ug/bq1h2z7-11.html
Ceemple 是一个快速的 JIT C++ 技术计算环境,它捆绑了几个用于技术计算的优化 C/C++ 库,因此您可以在 Ceemple 中进行快速原型设计和部署。可从http://www.ceemple.com获得(免费)。