Forums

冷杉过滤算法出现问题

开始于 未知 2012年11月20日
你好!

希望你们能帮助我:

我只是让我的冷杉滤清器工作正常!

我正在以10 KHz的采样频率采样声音,并使用128阶低
通过冷杉滤波器(从0到500 Hz传递)。

我正在使用的算法是这样的:

无效过滤(无效)
{
DAC12_0DAT =(signed int)out + 2048;
// 1)先前的结果输出

样本[0] = ADC12MEM0-2048;
//2) stores sample

out = 0;
counter = 128 - 1;

do
{
out + = sample [counter] * filter_taps [counter];
sample [counter] = sample [counter-1];
}
while (--counter);

out + = sample [counter] * filter_taps [counter];
out = out >>16 ;
DMAIV = 0;
}
我的问题:在听输出时,我只是听到噪音。

谢谢

费罗·桑托斯


MSP430入门微控制器

在某种程度上,这取决于您使用的特定MSP430,但是
我不相信即使是更快的速度也能实现128抽头FIR
以10kHz滤波。

每个样本相隔2500clocks,共有128次抽头,因此,如果每个
单个周期可用于您将略有过滤的算法
超过19个循环可用于计算每个抽头。一些说明可以
在一个周期内执行,但大多数将在5或6个周期内执行,因此即使
每条指令平均使用4个周期,并使用手动优化
汇编程序,您没有足够的时间执行此操作。



在设计或尝试之前,您是否尝试过计算所有这些?

在2012年11月20日晚上9:40,Fero Santos写道:
> Hello!
>
>希望你们能帮助我:
>
>我只是让我的冷杉滤清器工作正常!
>
>我正在以10 KHz的采样频率采样声音,并使用128阶低
>通过冷杉滤波器(从0到500 Hz传递)。
>
>我正在使用的算法是这样的:
>
>无效过滤(无效)
> {
>DAC12_0DAT =(signed int)out + 2048;
>// 1)先前的结果输出
>
>样本[0] = ADC12MEM0-2048;
>// 2)存储样本
>
> out = 0;
>计数器= 128-1;
>
> do
> {
>out + = sample [counter] * filter_taps [counter];
>sample [counter] = sample [counter-1];
> }
>同时(--counter);
>
>out + = sample [counter] * filter_taps [counter];
> out = out >>16 ;
> DMAIV = 0;
> }
>我的问题:在听输出时,我只是听到噪音。
>
> Thanks
>
> Fero Santos
>
>
>
实际上,我使用的是Cortex M3,而且效果很好(是的,
时钟是256次抽头的32M Hz)...

我的时钟是8M Hz。可以进行64次或32次点击
过滤器工作正常吗?

(只是不明白您是如何找到每个2500个时钟周期的
采样)。

干杯!

费罗

在2012年11月20日,星期二,11:09 AM,Onestone写道:

> **
>在某种程度上,这取决于您使用的特定MSP430,但是
>我不相信即使是更快的速度也能实现128抽头FIR
> filter at 10kHz.
>
>每个样本相隔2500clocks,共有128次抽头,因此,如果每个
>单个周期可用于您将略有过滤的算法
>超过19个循环可用于计算每个抽头。一些说明可以
>在一个周期内执行,但大多数将在5或6个周期内执行,因此即使
>每条指令平均使用4个周期,并使用手动优化
>汇编程序,您没有足够的时间执行此操作。
>
> Al
>
>在设计或尝试之前,您是否尝试过计算所有这些?
>在2012年11月20日晚上9:40,Fero Santos写道:
> > Hello!
> >
> >希望你们能帮助我:
> >
> >我只是让我的冷杉滤清器工作正常!
> >
> >我正在以10 KHz的采样频率采样声音并使用128抽头
> low
> >通过冷杉滤波器(从0到500 Hz传递)。
> >
> >我正在使用的算法是这样的:
> >
> >无效过滤(无效)
> > {
> >DAC12_0DAT =(signed int)out + 2048;
> >// 1)先前的结果输出
> >
> >样本[0] = ADC12MEM0-2048;
> > //2) stores sample
> >
> > out = 0;
> > counter = 128 - 1;
> >
> > do
> > {
> >out + = sample [counter] * filter_taps [counter];
> >sample [counter] = sample [counter-1];
> > }
> > while (--counter);
> >
> >out + = sample [counter] * filter_taps [counter];
> > out = out >>16 ;
> > DMAIV = 0;
> > }
> >
> >
> >我的问题:在听输出时,我只是听到噪音。
> >
> > Thanks
> >
> > Fero Santos
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
每个采样的时钟速率只是将Fosc / SRATE相除的一种情况,因此
25,000,000(最快的MSP430时钟)/ 10,000(采样率)为2500。
对于10kHz的8MHz,每个采样只有800个时钟,请记住
这是绝对最大值,您仍然需要收集和存储
采样等,因此每次抽头800时钟/ 32仍仅是25个时钟。

因此,我将首先得出您可以绝对优化的FIR代码,
如果可能的话,使用寄存器,然后使用汇编器,然后向后工作。
在16MHz下,您可能可以在10MHz下处理32个抽头滤波器。

我有一段时间没有在FSP上对FIR做任何事情了,但是
是Ti的一些不错的应用笔记/论文,它们是SLAA357,
描述了用于MSWP430 16x部件的FIR代码生成器,并提出了建议
他们可以执行662中以4kHz进行的21抽头低通FIR采样
时钟。所以这可能刚好是您的10kHz采样率。那是
如果以前没有这种情况,则很容易切换到更快的MSP
那匹马。其他应用笔记为SLAA 228。

至少它们之间将向您展示如何最佳地进行优化
您针对不同家庭成员的代码


在2012年11月20日晚上11:54,Fero Santos写道:
>实际上,我曾经使用过Cortex M3, 工作得很好(是的,
>时钟是256次抽头的32M Hz)...
>
>我的时钟是8M Hz。可以进行64次或32次点击
>过滤器工作正常吗?
>
>(只是不明白您是如何找到每个2500个时钟周期的
> sampling).
>
> Cheers!
>
> Fero
>在2012年11月20日,星期二,11:09 AM,Onestone写道:
>
>> **
>>在某种程度上,这取决于您使用的特定MSP430,但是
>>我不相信即使是更快的速度也能实现128抽头FIR
>> filter at 10kHz.
>>
>>每个样本相隔2500clocks,共有128次抽头,因此,如果每个
>>单个周期可用于您将略有过滤的算法
>>超过19个循环可用于计算每个抽头。一些说明可以
>>在一个周期内执行,但大多数将在5或6个周期内执行,因此即使
>>每条指令平均使用4个周期,并使用手动优化
>>汇编程序,您没有足够的时间执行此操作。
>>
>> Al
>>
>>在设计或尝试之前,您是否尝试过计算所有这些?
>>在2012年11月20日晚上9:40,Fero Santos写道:
>>> Hello!
>>>
>>>希望你们能帮助我:
>>>
>>>我只是让我的冷杉滤清器工作正常!
>>>
>>>我正在以10 KHz的采样频率采样声音并使用128抽头
>> low
>>>通过冷杉滤波器(从0到500 Hz传递)。
>>>
>>>我正在使用的算法是这样的:
>>>
>>>无效过滤(无效)
>>> {
>>>DAC12_0DAT =(signed int)out + 2048;
>>>// 1)先前的结果输出
>>>
>>>样本[0] = ADC12MEM0-2048;
>>> //2) stores sample
>>>
>>> out = 0;
>>> counter = 128 - 1;
>>>
>>> do
>>> {
>>>out + = sample [counter] * filter_taps [counter];
>>>sample [counter] = sample [counter-1];
>>> }
>>> while (--counter);
>>>
>>>out + = sample [counter] * filter_taps [counter];
>>> out = out >>16 ;
>>> DMAIV = 0;
>>> }
>>>
>>>
>>>我的问题:在听输出时,我只是听到噪音。
>>>
>>> Thanks
>>>
>>> Fero Santos
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
我的猜测是,“每个采样2500个时钟周期”是基于
在最快的msp430上达到25 MHz的速度。对于8 MHz时钟,您有800
每个样品的循环数。对于128抽头滤波器来说,这不是很多!

为了比较,Cortex M3在每个时钟周期将做更多的事情-
这种工作至少可能是它的十倍。我正在猜测
您使用32位整数作为中间结果吗?

您可以采取一些措施来改善代码,以减少不良后果。
每个抽头的时钟数。三个明显的观点是:

1.使用局部变量进行输出,以便将其放入寄存器对中
而不是记忆。

2.不要移动整个示例窗口-使用索引来跟踪
当前的“零”样本。

3.如果您的FIR滤波器是对称的(尽可能多),请将该事实减半
乘数。

4.仔细检查乘法,非常仔细地检查
生成的程序集。一些MSP430工具链将禁用中断
围绕乘法(以便可以安全地在
中断)-通常可以将其禁用。还要确保你是
使用适当大小的乘法-您可能想要一个
16x16->32位乘法在这里,但是根据您的数组类型,
您可能会得到32x32->32位(浪费大量时间)或16x16->16
(导致错误的结果)。
但是,我不希望您能够使用它。正如艾尔所说,32
在16 MHz时钟上分接x 10 KHz是一个更加现实的目标。你是一个
数量级对于这个处理器来说太雄心勃勃-您将
对于此类应用,使用Cortex M4(而非M3)更好。

在2012年11月20日14:24,Fero Santos写道:
>实际上,我曾经使用过Cortex M3, 工作得很好(是的,
>时钟是256次抽头的32M Hz)...
>
>我的时钟是8M Hz。可以进行64次或32次点击
>过滤器工作正常吗?
>
>(只是不明白您是如何找到每个2500个时钟周期的
> sampling).
>
> Cheers!
>
> Fero
>