工程中DSP代码片断
生活随笔
收集整理的這篇文章主要介紹了
工程中DSP代码片断
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//主程序
#include?"LF2407.H"
#include?"math.h"
#include?"verable.h"?????//定義用到的各個(gè)全局變量
#include?"inicial.c"????//系統(tǒng)初始化,CAP6捕獲初始化,AD采樣初始化,SCI串口通信初始化
#include?"dataprocess.c"?????//處理AD采樣的到的數(shù)據(jù),以便于用串口與上位機(jī)進(jìn)行通信
#include?"send_rece.c"?????//串口的收發(fā)中斷服務(wù)程序子函數(shù)
#include?"interrupt.c"?????//各種中斷服務(wù)程序,包括AD,串口,捕獲,phantom
#include?"fft_table.c"????//定義fft中運(yùn)用到的sin和cos表?????
#define?wsgr?portffff?????//0xFFFF(I/O?space)?is?address?of?register?WSGR
ioport?uint?portffff;
void?delay(long?int?a)
{
????long?int?i;
????for(i=0;i<a;i++);
}
void?Feed_Dog()
{
??*WDKEY=0x0055;
??*WDKEY=0x00AA;
}
void?main(void)
{???
????int?i=0;?
????int?j;??
????disable();????//禁止所有可屏蔽的中斷
????initial();?????//系統(tǒng)初始化2?
????Feed_Dog();//edit?by?liuwei
????wsgr=0x100;????//bus?visibility?off;IO?space?4?wait?states;both?data?and?program?space?0?wait?states
??????ADINITIAL();?????//AD采樣初始化?
??????T3initial();?????//T3初始化,用來作為發(fā)送最后一位的延時(shí),在發(fā)送最后一位時(shí),打開T3計(jì)時(shí)器,周期中斷時(shí)將485控制線置位接收狀態(tài)。
????cap1_initial();??????//CAP1捕獲初始化????????????????????
????cap4_initial();??????//CAP4捕獲初始化????????????????????
????RS232();????//SCI模塊初始化
????while(1)
????{???
????????while(adcounter<64)?/**//*沒有采到64點(diǎn)前,等待*/
????????{};
????????if(adcounter==64)???/**//*采滿64點(diǎn),開始fft計(jì)算*/
????????{??
????????????adcounter=0;
????????????
????????????//后兩行程序用來調(diào)試程序時(shí),利用T4的數(shù)據(jù)寄存器看fft算法和數(shù)據(jù)處理所需時(shí)間
????????//????*T4CNT=0x00;?
????????//?????*T4CON=*T4CON|0x0040;?????????
????????????
????????????
????????????if(Vcenterpreselect[0]>2)????//首先判斷是否第2級(jí)已經(jīng)飽和,如果第2級(jí)飽和,那么選擇第1級(jí)
????????????{???
????????????????Vcenter_choice=0;
????????????}
????????????else?if?(Vcenterpreselect[1]>2)????//如果第2級(jí)沒有飽和而第3級(jí)飽和,那么選擇第2級(jí)
????????????{
????????????????Vcenter_choice=1;
????????????}
????????????else????????????????//如果第2級(jí)第3級(jí)都沒有飽和,那么選擇第3級(jí)
????????????{
????????????????Vcenter_choice=2;
????????????}??
????????????Vcenterpreselect[0]=0;
????????????Vcenterpreselect[1]=0;
?????????????????for(i=0;i<64;i++)
????????????{
????????????????dataR[0][i]=dataC[Vcenter_choice][i];
????????????}????
????????
????????????for(i=0;i<64;i++)?????//最終有6路信號(hào)參與FFT變換,這6路信號(hào)都放在2維數(shù)組dataR[8][64]中的前6行中????
????????????{???
????????????????for(j=1;j<6;j++)
????????????????{
????????????????????dataR[j][i]=dataC[j+2][i];
????????????????}
????????????}?
????????????for(j=0;j<6;j++)
????????????{
????????????????FR[j]=0;
????????????????FI[j]=0;????
????????????}
????????????
????????????for(j=0;j<6;j++)
????????????{
????????????????FR[j]=(dataR[j][1]+dataR[j][63]-dataR[j][31]-dataR[j][33])*cos_tab[1];
????????????????FR[j]+=(dataR[j][2]+dataR[j][62]-dataR[j][30]-dataR[j][34])*cos_tab[2];??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????FR[j]+=(dataR[j][3]+dataR[j][61]-dataR[j][29]-dataR[j][35])*cos_tab[3];
????????????????FR[j]+=(dataR[j][4]+dataR[j][60]-dataR[j][28]-dataR[j][36])*cos_tab[4];
????????????????FR[j]+=(dataR[j][5]+dataR[j][59]-dataR[j][27]-dataR[j][37])*cos_tab[5];
????????????????FR[j]+=(dataR[j][6]+dataR[j][58]-dataR[j][26]-dataR[j][38])*cos_tab[6];
????????????????FR[j]+=(dataR[j][7]+dataR[j][57]-dataR[j][25]-dataR[j][39])*cos_tab[7];
????????????????FR[j]+=(dataR[j][8]+dataR[j][56]-dataR[j][24]-dataR[j][40])*cos_tab[8];
????????????????FR[j]+=(dataR[j][9]+dataR[j][55]-dataR[j][23]-dataR[j][41])*cos_tab[9];
????????????????FR[j]+=(dataR[j][10]+dataR[j][54]-dataR[j][22]-dataR[j][42])*cos_tab[10];
????????????????FR[j]+=(dataR[j][11]+dataR[j][53]-dataR[j][21]-dataR[j][43])*cos_tab[11];
????????????????FR[j]+=(dataR[j][12]+dataR[j][52]-dataR[j][20]-dataR[j][44])*cos_tab[12];
????????????????FR[j]+=(dataR[j][13]+dataR[j][51]-dataR[j][19]-dataR[j][45])*cos_tab[13];
????????????????FR[j]+=(dataR[j][14]+dataR[j][50]-dataR[j][18]-dataR[j][46])*cos_tab[14];
????????????????FR[j]+=(dataR[j][15]+dataR[j][49]-dataR[j][17]-dataR[j][47])*cos_tab[15];
????????????????FR[j]+=(dataR[j][0]-dataR[j][32])*cos_tab[0];
??????????????????????
????????????????FI[j]=(dataR[j][1]+dataR[j][31]-dataR[j][33]-dataR[j][63])*sin_tab[1];
????????????????FI[j]+=(dataR[j][2]+dataR[j][30]-dataR[j][34]-dataR[j][62])*sin_tab[2];
????????????????FI[j]+=(dataR[j][3]+dataR[j][29]-dataR[j][35]-dataR[j][61])*sin_tab[3];
????????????????FI[j]+=(dataR[j][4]+dataR[j][28]-dataR[j][36]-dataR[j][60])*sin_tab[4];
????????????????FI[j]+=(dataR[j][5]+dataR[j][27]-dataR[j][37]-dataR[j][59])*sin_tab[5];
????????????????FI[j]+=(dataR[j][6]+dataR[j][26]-dataR[j][38]-dataR[j][58])*sin_tab[6];
????????????????FI[j]+=(dataR[j][7]+dataR[j][25]-dataR[j][39]-dataR[j][57])*sin_tab[7];
????????????????FI[j]+=(dataR[j][8]+dataR[j][24]-dataR[j][40]-dataR[j][56])*sin_tab[8];
????????????????FI[j]+=(dataR[j][9]+dataR[j][23]-dataR[j][41]-dataR[j][55])*sin_tab[9];
????????????????FI[j]+=(dataR[j][10]+dataR[j][22]-dataR[j][42]-dataR[j][54])*sin_tab[10];
????????????????FI[j]+=(dataR[j][11]+dataR[j][21]-dataR[j][43]-dataR[j][53])*sin_tab[11];
????????????????FI[j]+=(dataR[j][12]+dataR[j][20]-dataR[j][44]-dataR[j][52])*sin_tab[12];
????????????????FI[j]+=(dataR[j][13]+dataR[j][19]-dataR[j][45]-dataR[j][51])*sin_tab[13];
????????????????FI[j]+=(dataR[j][14]+dataR[j][18]-dataR[j][46]-dataR[j][50])*sin_tab[14];
????????????????FI[j]+=(dataR[j][15]+dataR[j][17]-dataR[j][47]-dataR[j][49])*sin_tab[15];
????????????????FI[j]+=(dataR[j][16]-dataR[j][48])*sin_tab[16];
??????????????????????
????????????????//因?yàn)閟in,cos中都抬高了2^14倍,這里要再變回來因?yàn)镕R[j]的數(shù)據(jù)類型是32bit?long型,而后面?zhèn)鬏斒?*2?int型??????????
????????????????FR[j]=FR[j]>>14;
????????????????FI[j]=FI[j]>>14;?????????
????????????????//算取相位,范圍是0~360度,下面是把FR作為虛軸,FI作為實(shí)軸來計(jì)算的!!!!!!!!????????????????????????
????????????????tempA=FR[j]*FR[j];
????????????????tempB=FI[j]*FI[j];
????????????????tempC=(long)(sqrt(tempA+tempB)+0.5);
????????????????tempD=((float)FR[j])/((float)tempC);
????????????????amplitude[j]=tempC;
????????????????
????????????????if(tempD>1.0)
????????????????{
????????????????????tempD=1.0;
????????????????}?????????????????
????????????????if(tempD<-1.0)
????????????????{
????????????????????tempD=-1.0;
????????????????}
????
????????????????tempE=asin(tempD);
????????????????tempE=tempE*57.3;
????????????????????????
????????????????Phrase[j]=tempE;????????????????????
????????????????Phrase[j]=Phrase[j]*100;?
????????????????if(FI[j]<0)
????????????????{???????????????????????????????
????????????????????Phrase[j]=18000-Phrase[j];
????????????????}
????????????????else
????????????????{
????????????????????Phrase[j]=Phrase[j];
????????????????}?
????????????????if(Phrase[j]<0)
????????????????{
????????????????????Phrase[j]=Phrase[j]+36000;
????????????????}?????
????????????}?????????????
????????????
????????????if?(time_ad==0)????/**//*ad?采樣次數(shù),奇偶次分別用不同的數(shù)組?*/
????????????{??
????????????????dataprocess1();
????????????????time_ad=1;?//數(shù)據(jù)處理后放在datagrone[]中,datagrone[]中的數(shù)據(jù)更新完畢之后time_ad才會(huì)=1?
????????????
????????????}
????????????else
????????????{
????????????????dataprocess2();
????????????????time_ad=0;???????//數(shù)據(jù)處理后放在datagrtwo[]中,datagrtwo[]中的數(shù)據(jù)更新完畢之后time_ad才會(huì)=0
???????????????
????????????}?
????????????timer3=timer3+1;//對(duì)主函數(shù)中FFT計(jì)算的次數(shù)進(jìn)行計(jì)數(shù)
????????}
????}????????
}
這是我的一個(gè)工程里面DSP芯片的主程序,其他都很簡(jiǎn)單,主要用到了一個(gè)蝴蝶算法。
#include?"LF2407.H"
#include?"math.h"
#include?"verable.h"?????//定義用到的各個(gè)全局變量
#include?"inicial.c"????//系統(tǒng)初始化,CAP6捕獲初始化,AD采樣初始化,SCI串口通信初始化
#include?"dataprocess.c"?????//處理AD采樣的到的數(shù)據(jù),以便于用串口與上位機(jī)進(jìn)行通信
#include?"send_rece.c"?????//串口的收發(fā)中斷服務(wù)程序子函數(shù)
#include?"interrupt.c"?????//各種中斷服務(wù)程序,包括AD,串口,捕獲,phantom
#include?"fft_table.c"????//定義fft中運(yùn)用到的sin和cos表?????
#define?wsgr?portffff?????//0xFFFF(I/O?space)?is?address?of?register?WSGR
ioport?uint?portffff;
void?delay(long?int?a)
{
????long?int?i;
????for(i=0;i<a;i++);
}
void?Feed_Dog()
{
??*WDKEY=0x0055;
??*WDKEY=0x00AA;
}
void?main(void)
{???
????int?i=0;?
????int?j;??
????disable();????//禁止所有可屏蔽的中斷
????initial();?????//系統(tǒng)初始化2?
????Feed_Dog();//edit?by?liuwei
????wsgr=0x100;????//bus?visibility?off;IO?space?4?wait?states;both?data?and?program?space?0?wait?states
??????ADINITIAL();?????//AD采樣初始化?
??????T3initial();?????//T3初始化,用來作為發(fā)送最后一位的延時(shí),在發(fā)送最后一位時(shí),打開T3計(jì)時(shí)器,周期中斷時(shí)將485控制線置位接收狀態(tài)。
????cap1_initial();??????//CAP1捕獲初始化????????????????????
????cap4_initial();??????//CAP4捕獲初始化????????????????????
????RS232();????//SCI模塊初始化
????while(1)
????{???
????????while(adcounter<64)?/**//*沒有采到64點(diǎn)前,等待*/
????????{};
????????if(adcounter==64)???/**//*采滿64點(diǎn),開始fft計(jì)算*/
????????{??
????????????adcounter=0;
????????????
????????????//后兩行程序用來調(diào)試程序時(shí),利用T4的數(shù)據(jù)寄存器看fft算法和數(shù)據(jù)處理所需時(shí)間
????????//????*T4CNT=0x00;?
????????//?????*T4CON=*T4CON|0x0040;?????????
????????????
????????????
????????????if(Vcenterpreselect[0]>2)????//首先判斷是否第2級(jí)已經(jīng)飽和,如果第2級(jí)飽和,那么選擇第1級(jí)
????????????{???
????????????????Vcenter_choice=0;
????????????}
????????????else?if?(Vcenterpreselect[1]>2)????//如果第2級(jí)沒有飽和而第3級(jí)飽和,那么選擇第2級(jí)
????????????{
????????????????Vcenter_choice=1;
????????????}
????????????else????????????????//如果第2級(jí)第3級(jí)都沒有飽和,那么選擇第3級(jí)
????????????{
????????????????Vcenter_choice=2;
????????????}??
????????????Vcenterpreselect[0]=0;
????????????Vcenterpreselect[1]=0;
?????????????????for(i=0;i<64;i++)
????????????{
????????????????dataR[0][i]=dataC[Vcenter_choice][i];
????????????}????
????????
????????????for(i=0;i<64;i++)?????//最終有6路信號(hào)參與FFT變換,這6路信號(hào)都放在2維數(shù)組dataR[8][64]中的前6行中????
????????????{???
????????????????for(j=1;j<6;j++)
????????????????{
????????????????????dataR[j][i]=dataC[j+2][i];
????????????????}
????????????}?
????????????for(j=0;j<6;j++)
????????????{
????????????????FR[j]=0;
????????????????FI[j]=0;????
????????????}
????????????
????????????for(j=0;j<6;j++)
????????????{
????????????????FR[j]=(dataR[j][1]+dataR[j][63]-dataR[j][31]-dataR[j][33])*cos_tab[1];
????????????????FR[j]+=(dataR[j][2]+dataR[j][62]-dataR[j][30]-dataR[j][34])*cos_tab[2];??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????FR[j]+=(dataR[j][3]+dataR[j][61]-dataR[j][29]-dataR[j][35])*cos_tab[3];
????????????????FR[j]+=(dataR[j][4]+dataR[j][60]-dataR[j][28]-dataR[j][36])*cos_tab[4];
????????????????FR[j]+=(dataR[j][5]+dataR[j][59]-dataR[j][27]-dataR[j][37])*cos_tab[5];
????????????????FR[j]+=(dataR[j][6]+dataR[j][58]-dataR[j][26]-dataR[j][38])*cos_tab[6];
????????????????FR[j]+=(dataR[j][7]+dataR[j][57]-dataR[j][25]-dataR[j][39])*cos_tab[7];
????????????????FR[j]+=(dataR[j][8]+dataR[j][56]-dataR[j][24]-dataR[j][40])*cos_tab[8];
????????????????FR[j]+=(dataR[j][9]+dataR[j][55]-dataR[j][23]-dataR[j][41])*cos_tab[9];
????????????????FR[j]+=(dataR[j][10]+dataR[j][54]-dataR[j][22]-dataR[j][42])*cos_tab[10];
????????????????FR[j]+=(dataR[j][11]+dataR[j][53]-dataR[j][21]-dataR[j][43])*cos_tab[11];
????????????????FR[j]+=(dataR[j][12]+dataR[j][52]-dataR[j][20]-dataR[j][44])*cos_tab[12];
????????????????FR[j]+=(dataR[j][13]+dataR[j][51]-dataR[j][19]-dataR[j][45])*cos_tab[13];
????????????????FR[j]+=(dataR[j][14]+dataR[j][50]-dataR[j][18]-dataR[j][46])*cos_tab[14];
????????????????FR[j]+=(dataR[j][15]+dataR[j][49]-dataR[j][17]-dataR[j][47])*cos_tab[15];
????????????????FR[j]+=(dataR[j][0]-dataR[j][32])*cos_tab[0];
??????????????????????
????????????????FI[j]=(dataR[j][1]+dataR[j][31]-dataR[j][33]-dataR[j][63])*sin_tab[1];
????????????????FI[j]+=(dataR[j][2]+dataR[j][30]-dataR[j][34]-dataR[j][62])*sin_tab[2];
????????????????FI[j]+=(dataR[j][3]+dataR[j][29]-dataR[j][35]-dataR[j][61])*sin_tab[3];
????????????????FI[j]+=(dataR[j][4]+dataR[j][28]-dataR[j][36]-dataR[j][60])*sin_tab[4];
????????????????FI[j]+=(dataR[j][5]+dataR[j][27]-dataR[j][37]-dataR[j][59])*sin_tab[5];
????????????????FI[j]+=(dataR[j][6]+dataR[j][26]-dataR[j][38]-dataR[j][58])*sin_tab[6];
????????????????FI[j]+=(dataR[j][7]+dataR[j][25]-dataR[j][39]-dataR[j][57])*sin_tab[7];
????????????????FI[j]+=(dataR[j][8]+dataR[j][24]-dataR[j][40]-dataR[j][56])*sin_tab[8];
????????????????FI[j]+=(dataR[j][9]+dataR[j][23]-dataR[j][41]-dataR[j][55])*sin_tab[9];
????????????????FI[j]+=(dataR[j][10]+dataR[j][22]-dataR[j][42]-dataR[j][54])*sin_tab[10];
????????????????FI[j]+=(dataR[j][11]+dataR[j][21]-dataR[j][43]-dataR[j][53])*sin_tab[11];
????????????????FI[j]+=(dataR[j][12]+dataR[j][20]-dataR[j][44]-dataR[j][52])*sin_tab[12];
????????????????FI[j]+=(dataR[j][13]+dataR[j][19]-dataR[j][45]-dataR[j][51])*sin_tab[13];
????????????????FI[j]+=(dataR[j][14]+dataR[j][18]-dataR[j][46]-dataR[j][50])*sin_tab[14];
????????????????FI[j]+=(dataR[j][15]+dataR[j][17]-dataR[j][47]-dataR[j][49])*sin_tab[15];
????????????????FI[j]+=(dataR[j][16]-dataR[j][48])*sin_tab[16];
??????????????????????
????????????????//因?yàn)閟in,cos中都抬高了2^14倍,這里要再變回來因?yàn)镕R[j]的數(shù)據(jù)類型是32bit?long型,而后面?zhèn)鬏斒?*2?int型??????????
????????????????FR[j]=FR[j]>>14;
????????????????FI[j]=FI[j]>>14;?????????
????????????????//算取相位,范圍是0~360度,下面是把FR作為虛軸,FI作為實(shí)軸來計(jì)算的!!!!!!!!????????????????????????
????????????????tempA=FR[j]*FR[j];
????????????????tempB=FI[j]*FI[j];
????????????????tempC=(long)(sqrt(tempA+tempB)+0.5);
????????????????tempD=((float)FR[j])/((float)tempC);
????????????????amplitude[j]=tempC;
????????????????
????????????????if(tempD>1.0)
????????????????{
????????????????????tempD=1.0;
????????????????}?????????????????
????????????????if(tempD<-1.0)
????????????????{
????????????????????tempD=-1.0;
????????????????}
????
????????????????tempE=asin(tempD);
????????????????tempE=tempE*57.3;
????????????????????????
????????????????Phrase[j]=tempE;????????????????????
????????????????Phrase[j]=Phrase[j]*100;?
????????????????if(FI[j]<0)
????????????????{???????????????????????????????
????????????????????Phrase[j]=18000-Phrase[j];
????????????????}
????????????????else
????????????????{
????????????????????Phrase[j]=Phrase[j];
????????????????}?
????????????????if(Phrase[j]<0)
????????????????{
????????????????????Phrase[j]=Phrase[j]+36000;
????????????????}?????
????????????}?????????????
????????????
????????????if?(time_ad==0)????/**//*ad?采樣次數(shù),奇偶次分別用不同的數(shù)組?*/
????????????{??
????????????????dataprocess1();
????????????????time_ad=1;?//數(shù)據(jù)處理后放在datagrone[]中,datagrone[]中的數(shù)據(jù)更新完畢之后time_ad才會(huì)=1?
????????????
????????????}
????????????else
????????????{
????????????????dataprocess2();
????????????????time_ad=0;???????//數(shù)據(jù)處理后放在datagrtwo[]中,datagrtwo[]中的數(shù)據(jù)更新完畢之后time_ad才會(huì)=0
???????????????
????????????}?
????????????timer3=timer3+1;//對(duì)主函數(shù)中FFT計(jì)算的次數(shù)進(jìn)行計(jì)數(shù)
????????}
????}????????
}
這是我的一個(gè)工程里面DSP芯片的主程序,其他都很簡(jiǎn)單,主要用到了一個(gè)蝴蝶算法。
轉(zhuǎn)載于:https://www.cnblogs.com/coffeeliu/archive/2006/04/19/379405.html
總結(jié)
以上是生活随笔為你收集整理的工程中DSP代码片断的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔改和上线你的合成大西瓜,最全教程!
- 下一篇: 学习编程需要攻克的8个难关,一旦没有把握