DSP中浮点转定点运算--举例及编程中的心得_C 语言

5.举例及编程中的心得

5.1举例

  “第3章  DSP芯片的定点运算.doc”这篇文章中给了一个很简单有能说明问题的例子,不想动大脑了,直接引用过来如下。

  这是一个对语音信号(0.3kHz~3.4kHz)进行低通滤波的C语言程序,低通滤波的截止频率为800Hz,滤波器采用19点的有限冲击响应FIR滤波。语音信号的采样频率为8kHz,每个语音样值按16位整型数存放在insp.dat文件中。

例3.7  语音信号800Hz 19点FIR低通滤波C语言浮点程序

复制代码 代码如下:

#include <stdio.h>
const  int length = 180 /*语音帧长为180点=22.5ms@8kHz采样*/
void  filter(int xin[ ],int xout[ ],int n,float h[ ]); /*滤波子程序说明*/
/*19点滤波器系数*/
static  float h[19]=
    {0.01218354,-0.009012882,-0.02881839,-0.04743239,-0.04584568,
-0.008692503,0.06446265,0.1544655,0.2289794,0.257883,
0.2289794,0.1544655,0.06446265,-0.008692503,-0.04584568,
-0.04743239,-0.02881839,-0.009012882,0.01218354};
static  int x1[length+20];
/*低通滤波浮点子程序*/
void  filter(int xin[ ],int xout[ ],int n,float h[ ])
{
    int i,j;
    float sum;
    for(i=0;i<length;i++) x1[n+i-1]=xin[i];
    for (i=0;i<length;i++)
    {
        sum=0.0;
        for(j=0;j<n;j++) sum+=h[j]*x1[i-j+n-1];
        xout[i]=(int)sum;
    }
    for(i=0;i<(n-1);i++) x1[n-i-2]=xin[length-1-i];
}
 
/*主程序*/
void  main( )
{
    FILE    *fp1,*fp2;
    int     frame,indata[length],outdata[length];
    fp1=fopen(insp.dat,"rb");              /*输入语音文件*/
    fp2=fopen(outsp.dat,"wb");           /*滤波后语音文件*/
 
    frame=0;
    while(feof(fp1)==0)
    {
        frame++;
        printf("frame=%d/n",frame);
        for(i=0;i<length;i++)  indata[i]=getw(fp1);        /*取一帧语音数据*/
        filter(indata,outdata,19,h);            /*调用低通滤波子程序*/
        for(i=0;i<length;i++)  putw(outdata[i],fp2);     /*将滤波后的样值写入文件*/
    }
    fcloseall( );                   /*关闭文件*/
    return(0);
}

例3.8  语音信号800Hz 19点FIR低通滤波C语言定点程序

复制代码 代码如下:

#include <stdio.h>
const int length=180;
void  filter(int xin[ ],int xout[ ],int n,int h[ ]);
static int  h[19]={399,-296,-945,-1555,-1503,-285,2112,5061,7503,8450,
    7503,5061,2112,-285,-1503,-1555,-945,-296,399};           /*Q15*/
static int  x1[length+20];
/*低通滤波定点子程序*/
void  filter(int xin[ ],int xout[ ],int n,int h[ ])
{
    int i,j;
    long sum;
    for(i=0;i<length;i++) x1[n+i-1]=xin[i];
    for (i=0;i<length;i++)
    {
        sum=0;
        for(j=0;j<n;j++)  sum+=(long)h[j]*x1[i-j+n-1];
        xout[i]=sum>>15;
    }
    for(i=0;i<(n-1);i++) x1[n-i-2]=xin[length-i-1];
}

主程序与浮点的完全一样。

5.2编程中的心得

  通过上边的例子,相信大家都大致明白了转换的过程。一个函数模块如此,一个大的软件项目的转换也无非如此。所不同的是,对于一个项目,很少有一个个单独的模块,一般都是几个或数个模块都有联系,千一发而动全身,所以,再进行转换之前,最好理清各个软件模块之间的关系。

  协调,协调,再协调。

  写到这里, 与afreez一起学习DSP中浮点转定点运算这个问题的讨论终于可以收笔了。拖拖拉拉,拉了有3个月之久,现在终于可以了却自己的愧疚了。从第三部分开始,写的有写着急,因为没有足够的时间来写,还想把剩下的写完,只能这么解决了。我想,文章只是给出学者一个思路,如果自己以后遇到了这样的问题,还需要自己去探索的,没有一劳永逸的文章,毕竟问题都各个不同吗。

  文章中难免有不妥之处,欢迎大家批评指正!

时间: 2024-10-29 19:15:51

DSP中浮点转定点运算--举例及编程中的心得_C 语言的相关文章

解析C++编程中异常相关的堆栈展开和throw()异常规范_C 语言

C++ 中的异常和堆栈展开在 C++ 异常机制中,控制从 throw 语句移至可处理引发类型的第一个 catch 语句.在到达 catch 语句时,throw 语句和 catch 语句之间的范围内的所有自动变量将在名为"堆栈展开"的过程中被销毁.在堆栈展开中,执行将继续,如下所示: 控制通过正常顺序执行到达 try 语句.执行 try 块内的受保护部分. 如果执行受保护的部分的过程中未引发异常,将不会执行 try 块后面的 catch 子句.执行将在关联的 try 块后的最后一个 ca

C++多线程编程时的数据保护_C 语言

 在编写多线程程序时,多个线程同时访问某个共享资源,会导致同步的问题,这篇文章中我们将介绍 C++11 多线程编程中的数据保护.数据丢失 让我们从一个简单的例子开始,请看如下代码:   #include <iostream> #include <string> #include <thread> #include <vector> using std::thread; using std::vector; using std::cout; using std

C++ 关于MFC多线程编程的注意事项_C 语言

在多线程编程中,最简单的方法,无非就是利用 AfxBeginThread  来创建一个工作线程,看一下这个函数的说明: 复制代码 代码如下: CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_AT

C++中的多态与虚函数的内部实现方法_C 语言

1.什么是多态 多态性可以简单概括为"一个接口,多种行为". 也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法).也就是说,每个对象可以用自己的方式去响应共同的消息.所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数.这是一种泛型技术,即用相同的代码实现不同的动作.这体现了面向对象编程的优越性. 多态分为两种: (1)编译时多态:主要通过函数的重载和模板来实现. (2)运行时多态:主要通过虚函数来实现. 2.几个相关概念 (1)覆盖.

MFC中动态创建控件以及事件响应实现方法_C 语言

本文实例讲述了MFC中动态创建控件以及事件响应实现方法,分享给大家供大家参考.具体实现方法如下: 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示. 静态控件不需要调用Create()

DSP中浮点转定点运算--定点数的加减乘除运算_C 语言

3.定点数的加减乘除运算 简单的说,各种运算的原则就是先把待运算的数据放大一定的倍数,在运算的过程中使用的放大的数据,在最终需要输出结果的时候再调整回去. 举个例来说,有如下运算: 复制代码 代码如下: - // coefs1 = 0.023423; coefs2=0.2131 float coefs1,coefs2; int result; - result = 34* coefs1+72* coefs2; - 代码的意思是,该模块需要输出一个整型的结果,但计算的过程中有浮点的运算.如果在定点

DSP中浮点转定点运算--浮点与定点概述_C 语言

一:浮点与定点概述  1.1相关定义说明 定点数:通俗的说,小数点固定的数.以人民币为例,我们日常经常说到的如123.45¥,789.34¥等等,默认的情况下,小数点后面有两位小数,即角,分.如果小数点在最高有效位的前面,则这样的数称为纯小数的定点数,如0.12345,0.78934等.如果小数点在最低有效位的后面,则这样的数称为纯整数的定点数,如12345,78934等. 浮点数:一般说来,小数点不固定的数.比较容易的理解方式是,考虑以下我们日常见到的科学记数法,拿我们上面的数字举例,如123

DSP中浮点转定点运算--浮点数的存储格式_C 语言

二:浮点数的存储格式 2.1 IEEE floating point standard 上面我们说了,浮点数的小数点是不固定的,如果每个人都按照自己的爱好存储在电脑里,那不就乱套了吗?那么怎么在计算机中存储这种类型的数字呢?象这类古老的问题前人早都为我们做好了相应的规范,无规矩不成方圆吗.我们平时所说的浮点数的存储规范,就是由IEEE指定的,具体的规范文件是:IEEE Standard 754 for Binary Floating-Point Arithmetic.大家可以很容易的从网络上下载

DSP中浮点转定点运算--定点数模拟浮点数运算及常见的策略_C 语言

4.定点数模拟浮点数运算及常见的策略 相信大家到现在已经大致明白了浮点数转换成定点数运算的概貌.其实,原理讲起来很简单,真正应用到实际的项目中,可能会遇到各种各样的问题.具我的经验,常见的策略有如下几条: 1)除法转换为乘法或移位运算 我们知道,不管硬件平台如果变换,除法运算所需要的时钟周期都远远多于乘法运算和加减移位运算,尤其是在嵌入式应用中,"效率"显得尤为重要.以笔者的经验,其实,项目中的很大一部分除法运算是可以转换成乘法和移位运算,效率还是有很大提升空间的. 2)查表计算 有些