打印

运行程序时变量值为1.#QNAN是怎么回事?

[复制链接]
15851|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nanguamache|  楼主 | 2011-4-23 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
aresc| | 2011-4-23 18:21 | 只看该作者
QNAN表示一个无效的浮点数. 就是说你的程序有问题,运算出错了.

使用特权

评论回复
板凳
nanguamache|  楼主 | 2011-4-23 21:34 | 只看该作者
这是由于溢出造成的吗?我在调用那个函数时其它变量显示的都正确啊,只是运算时dlyl_0和dlyl_1显示不正确。具体程序是这样的:
for(k=0;k<2;k++)
          {
           
           pa_0=a18_0+k;
           for(i=0;i<2;i++)
           {
            a0=*(*(pa_0)+i);
           }
           pa_1=a18_1+k;
           for(i=0;i<2;i++)
           {
            a1=*(*(pa_1)+i);
           }
           
           g=G[k];
           
           DSPF_sp_biquad(Buffer_iir_l,b18_0,a0,dlyl_0,mid_iir,512);
           DSPF_sp_biquad(mid_iir,b18_1,a1,dlyl_1,Buffer_iir_l,512);
          }
          前面是用行指针来改变滤波器的系数,这部分通过变量观察窗口显示是正确的。这个程序作用是让原始数据循环两次以实现通过两个不同系数滤波器的功能。 2# aresc

使用特权

评论回复
地板
aresc| | 2011-4-23 21:55 | 只看该作者
本帖最后由 aresc 于 2011-4-23 22:41 编辑

两个for (i=0; i<2; i++)循环是不是用错了? a0和a1总是用计算了两次,但i=0的那一次被i=1覆盖了. 还有就是delay buffer有没有初始化为0? 还有就是DSPF_sp_biquad的前5个参数的类型都是float *类型.

从你的代码看对一个512的数据通过4个级联的BIQUAD滤波,滤波器的系数(b0,b1,b2,a1,a2)其中biquad 1 和3的b0,b1,b2不会变,biquad 2和4的b0,b1,b2不会变, 是这样的吗?

使用特权

评论回复
5
nanguamache|  楼主 | 2011-4-25 15:38 | 只看该作者
本帖最后由 nanguamache 于 2011-4-25 15:40 编辑

那两个i循环里应该分别是a0和a1,之前贴错了不好意思,两个delay buffer前面有初始化为0,函数的参数定义也都是float类型。
我的程序其实是想编一个1/3倍频程的程序,需要的就是将采集到的原始音频信号分别通过30组滤波器(滤波器由两个二阶滤波器级联实现),再计算每一组滤波结果的分贝值。我是想通过这种行指针的方式用循环来实现,不然要把三十组滤波器函数都列出来太麻烦了,现在就想想通过两组滤波器试试这样行不行。之前直接把两个滤波器列出来那样就没有问题。我在想是不是还是指针用的不好。
再有一个问题就是,你知道怎么找到DSPF_sp_biquard的调用程序吗?我在工程的.lib文件里只找到了C语言的程序段,但具体调用的程序文件不知道在哪里。。。
4# aresc

使用特权

评论回复
6
nanguamache|  楼主 | 2011-4-25 15:40 | 只看该作者
是a0和a1 4# aresc

使用特权

评论回复
7
nanguamache|  楼主 | 2011-4-25 15:41 | 只看该作者
a0[i]和a1[i]

使用特权

评论回复
8
aresc| | 2011-4-25 21:07 | 只看该作者
可以用一组bypass的滤波器系数验证你的程序对不对. 比如一个biquad的系数为(b0,b1,b2,a1,a2), 让b0 = 1.0,其他的全位0,那么滤波器的的输出就和它的输入是一样的.

我没用个这个库函数. 对应调用,你要先确定在这个函数在TI的哪个库文件中,要确定这个库能用于你的DSP上,然后把这个库文件添加到你的工程中. 然后把对应的头文件dspf_sp_biquad.h include到你的代码中.

使用特权

评论回复
9
aresc| | 2011-4-25 22:14 | 只看该作者
我刚用C6711的simulator试了一下,使用dsp67x.lib, 从TI的网站下载sprc121.zip解压缩之后就有这个库文件. 当调用DSPF_sp_biquad时只要最后一个参数(滤波的点数)不是3的倍数,程序就从那个函数里出不来.

#include <stdio.h>
#include "dspf_sp_biquad.h"

float B[] = {1.0, 0, 0};
float A[] = {0, 0};

float inbuf[128];
float outbuf[128];
float delay[2];

void main(void)
{
        int i, j;
        float *pIn, *pB, *pA, *pDly, *pOut;
        int cnt;

        cnt = 128;
        for (i=0; i<cnt; i++)
        {
                inbuf[i] = i+1;
                outbuf[i] = 0.0;
        }

        delay[0] = 0.;
        delay[1] = 0.;

        pIn = inbuf;
        pB  = B;
        pA  = A;
        pDly = delay;
        pOut = outbuf;
       
        DSPF_sp_biquad(pIn, pB, pA, pDly, pOut, 3);

        j = cnt;

}

TI的DSPF_sp_biquad函数C程序如下:
void DSPF_sp_biquad    (
                float x[],         //Pointer to input samples
                float b[],         //Pointer to numerator coefficients b[0], b[1] and b[2]
                float a[],         //Pointer to denominator coefficients a[1] and a[2]
                float delay[],     //Pointer to filter delays, delay[0] and delay[1]
                float r[],         //Pointer to output samples
                int      nx         //Number of input/output samples
               )
{
    int i;
    float a1, a2, b0, b1, b2, d0, d1, x_i;

    a1 = a[0];
    a2 = a[1];

    b0 = b[0];
    b1 = b[1];
    b2 = b[2];

    d0 = delay[0];
    d1 = delay[1];

    for (i = 0; i < nx; i++)
    {
        x_i = x[i];
        r[i] = b0 * x_i + d0;
        d0 = b1 * x_i - a1 * r[i] + d1;
        d1 = b2 * x_i - a2 * r[i];
    }
    delay[0] = d0;
    delay[1] = d1;
}

从C程序看不出点数必须是3的倍数, 所以估计库里的函数是汇编实现的,搞不懂哪里出问题了.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

53

帖子

0

粉丝