首先,您当然可以使用 ARM 或 Intel 或 Arduino 或其他任何东西。DSP 芯片是针对最常见的 DSP 操作进行优化的 MPU。
考虑一个 FIR 滤波器。
y[n]=∑i=0N−1h[i]x[n−i]
条指令中执行该操作,DSP 必须在一条指令中执行以下操作:N
- 和样本相乘。h[i]x[n−i]
- 将乘积添加到累加器中。h[i]x[n−i]
- 预取,对于下一条指令和和h[i+1]x[n−(i+1)]
- 后递增指向和h[i+2]x[n−(i+2)]
如果累加器是定点的,它的宽度应该足够宽,以至于右边没有舍入,左边有足够的保护位来溢出。那么应该有一个饱和指令(或者当单词移动到输出时会自动完成饱和)。
最后,指向的指针必须具有循环或模寻址模式,以便它“环绕”,因为中的数据存储在循环 FIFO 缓冲区中。x[n−i]x[n]
现在,一个 DSP 芯片可能会用它的专用硬件来完成所有这些工作,但你不需要使用 DSP,只要你,程序员,愿意处理这些细节。鉴于某些 MPU 的运行时钟速率比大多数廉价 DSP 快得多,即使您必须使用多条指令执行所有这些操作,它仍然可能在 ARM 上比在 SHArC 上运行得更快。也许不吧。
在进行循环寻址时,最简单的方法是使用常规数组(如在 C 中),但将该数组的大小定义为 2 的幂(例如)。然后使用AND操作(如C 中的“&”)屏蔽除低位之外的所有位。这将完成对数据索引或地址的模运算。2pp
除此之外,这主要是了解 DSP 的数学,了解有关有限宽度字的数字问题,无论它们是固定的还是浮点的,并且要小心。DSP 编程实际上与任何其他数学编程没有什么不同。