5735|10

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

中断函数中调用fft库的问题 [复制链接]

本帖最后由 dontium 于 2015-1-23 13:27 编辑

我要做一个语音端点检测的程序,用的vpm642的开发板,aic23b语音芯片,用EDMA输入和输出采集的语音信号,使用了输出和输出两个pingpong缓存,在输入ping或pong缓存接受完数据后产生中断,将数据做fft变换等算法,然后再把处理后的数据复制到输出ping或pong缓存。
可是奇怪的是,好像程序运行完fft库函数后就被下一个中断给中断了,无法完成全部算法。可是我计算了一下,应该是有足够的时间在两次中断间完成算法的啊,不知斑竹或是那位大牛能够提点一二,解决这个问题呢。

最新回复

       #include <stdio.h> #include <stdlib.h> #include <csl.h> #include <csl_timer.h> #include <math.h> /* ======================================================================== */ /* Include the DSPLIB header file                                           */ /* ======================================================================== */ #include \"dsp_fft32x32.h\" /* ======================================================================== */ /* Macro definition                                                         */ /* ======================================================================== */ #define PI  (3.141592654) #define NN  (512) /* ======================================================================== */ /* Input and output arrays                                                  */ /* ======================================================================== */ #pragma DATA_ALIGN(x, 8)       #pragma DATA_ALIGN(xx, 8)       #pragma DATA_ALIGN(y, 8) #pragma DATA_ALIGN(w, 8) int x[2*NN];               int w[2*NN];               int xx[2*NN];             int y[2*NN];               unsigned int z[2*NN]; short ch[NN]; /* ======================================================================== */ /*  D2I -- Truncate a \'double\' to a \'int\',   with clamping.                 */ /* ======================================================================== */ static int d2i(double d) {     if (d >=  2147483647.0) return (int)0x7FFFFFFF;     if (d <= -2147483648.0) return (int)0x80000000;     return (int)d; } int gen_twiddle_fft32x32(int *w, int n, double scale) {     int i, j, k, s=0, t;     for (j = 1, k = 0; j < n >> 2; j = j << 2, s++)     {         for (i = t=0; i < n >> 2; i += j, t++)         {             w[k +  5] = d2i(scale * cos(6.0 * PI * i / n));             w[k +  4] = d2i(scale * sin(6.0 * PI * i / n));             w[k +  3] = d2i(scale * cos(4.0 * PI * i / n));             w[k +  2] = d2i(scale * sin(4.0 * PI * i / n));             w[k +  1] = d2i(scale * cos(2.0 * PI * i / n));             w[k +  0] = d2i(scale * sin(2.0 * PI * i / n));             k += 6;         }     }     return k; } void main(void) {     FILE *file;         short iRead;        int i;            int tempI,tempR;     /* ==================================================================== */     /* Initialize Chip Support Library                                      */     /* ==================================================================== */     CSL_init();           file = fopen(\"test1.PCM\", \"rb\"         iRead = fread(ch, 1, NN, file);         //iRead = fread(ch, 1, NN, file);         fclose(file);     /* ==================================================================== */     /* Generate Q.31 input data                                             */     /* ==================================================================== */     for(i=0; i<NN; i++)     {         x[2*i] = xx[2*i] = (int)ch;         x[2*i+1] = xx[2*i+1] = 0;     }     /* ==================================================================== */     /* Generate twiddle factors                                             */     /* ==================================================================== */         gen_twiddle_fft32x32(w, NN, 2147483647.);           DSP_fft32x32(w, NN, x, y);              for(i=0; i<NN; i++)         {        tempI=y[i*2];             tempR=y[i*2+1];             z = tempI * tempI + tempR * tempR;                    }            printf(\"END\\n\" ); } /* ======================================================================== */ /*  End of file: fft32x32_main.c                                            */ /* ======================================================================== */ test1.pcm是8K采样的16BIT语音信号文件。用cool edit pro软件产生。实际是一个440hz正弦信号。 问题描述(用的是CCS3.1环境): 1、当信号幅值很小的时候,运行程序到末尾后用view/graph看z数组。发现会出现两个对称的峰值。第一个落在z[28]附件,另外一个落在z[480]附件。为什么这样?这是一个正弦波    。虽然z没有开平方,但是应该是单一峰值啊。 2、当增大波形的幅值,频率不变后,再看z。发现峰值的波形变宽变乱。为什么这个算法和输入的动态范围有关?如何让FFT变换和输入幅值没有关系? 3、把iRead = fread(ch, 1, NN, file);语句重复,也就是ch的值取文件的第二次读写结果进行变换,z的结果完全乱了。按照道理,波形文件足够长,又是一个正弦波形。    应该没有变化才对。我怀疑什么地方错了。但是我用view/graph看xx的FFT,没有改变。这么说变换前数据是一样的。这是为什么?   详情 回复 发表于 2008-9-26 11:13
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没人回复。自己顶一下,问下是不是和缓存优化有关。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我问一下.你的程序是用防真器调的还是烧入片子里调的?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
没有烧进去,是用仿真器调的,希望各位能够指点一二。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 
仿真器中断会出问题的.
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
难道仿真器处理中断是会出问题?
我不用fft的话,还是可以处理信号的,就是怕中断服务函数处理时间太长,不能下下个中断到来前完成。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 

是这个吗?

闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

11
 

楼主帮忙看看我的FFT变换问题,实在没有办法了

闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏闁诲孩鑹鹃ˇ浼村Φ閸曨垰绠抽柛鈩冦仦婢规洜绱撻崒娆戝妽妞ゃ劌妫濋弫鍐閻樺灚娈惧┑掳鍊曢幊搴㈠劔闂備礁鐤囧銊х矆娴h鍙忛柕鍫濐槹閻撶喖鏌e鈧禍璺侯瀶閻戣姤鐓曢柡鍌濇硶缁犵粯銇勯姀锛勬噰妤犵偛顑夐弫鍌炴嚍閵夛妇褰ㄩ梺璇查閸樻粓宕戦幘缁樼厱闁归偊鍘奸崝銈嗙箾閸剚瀚�闂傚倸鍊峰ù鍥儍椤愶箑骞㈤柍杞扮劍椤斿嫮绱撻崒姘偓鍝ョ矙閸曨垰绠柨鐕傛嫹闂傚倸鍊烽懗鍫曞箠閹剧粯鍋ら柕濞炬櫆閸嬪鏌i幇顒佹儓闁绘帒鐏氶妵鍕箳閹搭垱鏁鹃柣搴㈢啲閹凤拷婵犵數濮烽弫鎼佸磻濞戔懞鍥敇閵忕姷顦悗鍏夊亾闁告洦鍋夐崺鐐烘⒑鐠恒劌娅愰柟鍑ゆ嫹
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【TI有奖直播报名中】
直播主题:MSPM0 系列 MCU 再添新成员:高性能与高性价比的优秀组合 MSPM0G351x / MSPM0L111x
直播时间:4月24日(周四)上午10:00
直播奖励:好礼等您拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 10

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表