找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1872|回复: 1
打印 上一主题 下一主题
收起左侧

基于DSP滤波器的设计与实现

[复制链接]
跳转到指定楼层
楼主
ID:1024008 发表于 2022-5-19 17:13 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MATLAB仿真程序
窗函数设计法:
Fs=100;
t=(1:100)/Fs;
s1=sin(2*pi*t*5);
s2=sin(2*pi*t*15);
s3=sin(2*pi*t*30);
s=s1+s2+s3;
figure(1);
subplot(2,2,1);
plot(t,s)%画出信号的时域波形
xlabel('Time(seconds)')
ylabel('Time waveform')
title('原始信号的时域波形')%程序功能:画出信号的频谱图。
S=fft(s,512);%对s进行快速傅立叶变换
w=(0:255)/256*(Fs/2);
subplot(2,2,2);
plot(w,abs(S(1:256)))%画出信号的幅度图
xlabel('Frequency(Hz)')
ylabel('幅度')
title('幅度谱')
axis([0 35 0 60]);
subplot(2,2,3);
plot(w,angle(S(1:256)))%画出信号的相位图
xlabel('Frequency(Hz)')
ylabel('相位')
title('相位谱')%程序功能:设计低通滤波器并画出其频谱图:
%%%%%%%%%%%%%%低通
fb=10;
fc=13;%设置滤波器截止频率
fs=100;
wb=2*pi*fb/fs;
ws=2*pi*fc/fs;
wc=0.5*(wb+ws);
tr_width=ws-wb;%过渡带宽
%%%%%%%%%%%%%%高通
%fb=25;
%fc=22;%设置滤波器截止频率
%fs=100;
%wb=2*pi*fb/fs;
%ws=2*pi*fc/fs;
%wc=0.5*(wb+ws);
%tr_width=wb-ws;%过渡带宽
%%%%%%%%%%%%%%%%%%%带通
%fc1=9;fb1=12;fb2=18;fc2=21;fs=100;
%wb1=2*pi*fb1/fs;ws1=2*pi*fc1/fs;wb2=2*pi*fb2/fs;
%ws2=2*pi*fc2/fs;wc1=0.5*(wb1+ws1);wc2=0.5*(wb2+ws2);
%tr_width=min((wb1-ws1),(ws2-wb2));
M=ceil(1.8*pi/tr_width);
n=[0:1:M-1];
hd=ideal_lp(wc,M);
%w_box=(boxcar(M))'
%w_box=(triang(M))'
%w_box=(hamming(M))'
w_box=(kaiser(M,2.5))'
h=hd.*w_box;
[H,w]=freqz(h,[1],1000,'whole');
H=(H(1:501))';
w=(w(1:501))';
mag=abs(H);
db=20*log10((mag+eps)/max(mag));
pha=angle(H);
grd=grpdelay(h,[1],w);
figure(2);
subplot(2,2,1);stem(n,hd);%理想脉冲响应
xlabel('n');
ylabel('hd(n)');
title('Ideal Impulse Response');
subplot(2,2,2);stem(n,w_box);%矩形窗
xlabel('n');
ylabel('w(n)');
title('Kaiser Window');
subplot(2,2,3);stem(n,h);%实际脉冲响应
xlabel('n');
ylabel('h(n)');
title('Actual Impulse Response');
subplot(2,2,4);plot(w*fs/(2*pi),db);%幅度响应(dB)
axis([0 40-50 0]);
xlabel('Frequency(Hz)');
ylabel('Decibels');
title('Magnitude Response in dB');
sf=filter(h,[1],s);%sf为滤滤波后的信号
figure(3);
subplot(2,2,1);
plot(t,sf)%画出滤波后信号的时域波形
xlabel('Time(seconds)')
ylabel('Time waveform')
axis([0 1-1 1]);
title('滤波后信号的时域波形')
SF=fft(sf,512);%对sf进行快速傅里叶变换
w=(0:255)/256*(Fs/2);
subplot(2,2,2);
plot(w,abs(SF(1:256)))%画出滤波后信号的幅度图
xlabel('Frequency(Hz)')
ylabel('幅度谱')
title('滤波后信号的幅度谱');
subplot(2,2,3);
plot(w,angle(SF(1:256)))%画出滤波后信号的相位图
xlabel('Frequency(Hz)')
ylabel('相位谱')
title('滤波后信号的相位谱')%程序功能:对滤波前后信号进行比较
subplot(2,2,4);
plot(w,abs([S(1:256)'SF(1:256)']))%将滤波前后信号的幅度谱画在一起
xlabel('Frequency(Hz)')
ylabel('Mag.of Fourier transform')
legend({'before','after'})%对两个曲线进行区分命名
title('滤波前后信号对比')
频率采样设计法:
N=100;Fs=100; %数据总数和采样频率
fc1=12;
fc2=18;
n=[0:N-1];t=n/Fs;%时间序列
f1=5;f2=15;f3=30;
x=sin(2*pi*f1*t)+sin(2*pi*f2*t)+sin(2*pi*f3*t);%输入信号
%设计25阶的低通滤波器,归一化截止频率为fc*2/Fs
b=fir1(25,0.2);
y1=fftfilt(b,x,256);%对数据进行滤波
n1=1:100;t1=t(n1);%选择采样点间隔
x1=x(n1);%与采样点对应的输入信号
subplot(2,2,1);plot(t1,x1);%绘制输入信号
title('输入信号');
S=fft(x,512);% 对x进行快速傅立叶变换
w=(0:255)/256*(Fs/2);   
subplot(2,2,2);
plot(w,abs(S(1:256)))% 画出信号的幅度图
xlabel('Frequency (Hz)')
ylabel('幅度')
title('幅度谱')
n2=n1;t2=t(n2);%输出信号,扣除了相位延迟N/2
y2=y1(n2);
subplot(2,2,3);plot(t2,y2);%绘制输出信号
title('输出信号');
xlabel('时间/s')
SF=fft(y1,512);% 对sf进行快速傅里叶变换   
w=(0:255)/256*(Fs/2);
subplot(2,2,4);
plot(w,abs(SF(1:256)))% 画出滤波后信号的幅度图
xlabel('Frequency (Hz)')
ylabel('幅度谱')
title('滤波后信号的幅度谱');
figure(2);
[H,f]=freqz(b,1,512,Fs);
plot(f,20*log10(abs(H)));

DSP实现程序

FIR.c程序:
#include<math.h>
#define FIRNUMBER 25
#define PI 3.1415926
float InputWave();
float FIR();
FloatfHn[FIRNUMBER]={51455693,35039587,0,-43569197,-79886877,-91884544,-66619233,0,100778399,218060512,327780957,405671856,433829342,405671856,327780957,218060512,100778399,0,-66619233,-91884544,-79886877,-43569197,0,35039587,51455693};
float fXn[FIRNUMBER]={0.0};
float fInput,fOutput;
float fSignal1,fSignal2,fSignal3;
float fStepSignal1,fStepSignal2,fStepSignal3;
float f2PI;
int i;
float fIn[256],fOut[256];
int nIn,nOut;
main()
{
nIn=0;nOut=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=0.0;
fStepSignal1=2*PI/20;
fStepSignal2=6*PI/20;
fStepSignal3=12*PI/20;
while(1)
{
        fInput=InputWave();
        fIn[nIn]=fInput;
        nIn++;nIn%=256;
        fOutput=FIR();
        fOut[nOut]=-fOutput;
        nOut++;                                /*break point*/
        if(nOut>=256)
        {
                nOut=0;               
        }
        }
}
float InputWave()
{
        for(i=FIRNUMBER-1;i>0;i--)
                fXn[i]=fXn[i-1];
        fXn[0]=sin(fSignal1)+sin(fSignal2)+sin(fSignal3);
        fSignal1+=fStepSignal1;
        if(fSignal1>=f2PI)        fSignal1-=f2PI;
        fSignal2+=fStepSignal2;
        if(fSignal2>=f2PI)        fSignal2-=f2PI;
        fSignal3+=fStepSignal3;
        if(fSignal3>=f2PI)        fSignal3-=f2PI;
        return(fXn[0]);
}
float FIR()
{
        float fSum;
        fSum=0;
        for(i=0;i<FIRNUMBER;i++)
        {
                fSum+=(fXn[i]*fHn[i]);
        }
        return(fSum);
}

Test.cmd程序:
-heap 100
-stack 400
-sysstack 400
-l rts55x.lib
MEMORY
{
        PAGE 0:PROG(R):origin=0x80000,length=0x10000
        PAGE 0:BOOT(R):origin=0x3FF000,length=0xFC0
        PAGE 0:RESET(R):origin=0x3FFC0,length=0x2
        //PAGE 0:VECTORS(R):origin=0x3FFC2,length=0x3E
        PAGE 1:M0RAM(RW):origin=0x000000,length=0x400
        PAGE 1:M1RAM(RW):origin=0x000400,length=0x400
        PAGE 1:L0L1RAM(RW):origin=0x008000,length=0x2000
        PAGE 1:H0RAM(RW):origin=0x3F8000,length=0x2000
}
SECTIONS
{
        .reset:>RESET,PAGE=0
        .pinit:>PROG,PAGE=0
        .cinit:>PROG,PAGE=0
        .text:>PROG,PAGE=0
        .const:>L0L1RAM,PAGE=1
        .bass:>L0L1RAM,PAGE=1
//        .stack:>M1RAM,PAGE=1
        .sysmem:>M0RAM,PAGE=1
        .ebss:>H0RAM,PAGE=1
        .econst:>H0RAM,PAGE=1
        .esysmem:>H0RAM,PAGE=1
}

实时采样滤波程序

#include"myapp.h"
#include"ICETEK-VC5509-EDU.h"
#include"scancode.h"
#include"fir.h"
#define FIRNUMBER 65
//采样频率为30KHZ
/*float fHn[FIRNUMBER]={16301406,9209864,0,-9845027,-18630178,-24725447,-26849895,-24316004,-17191312,-6345307,6633730,19647214,30395005,36741961,37088170,30685000,17844111,0,-20393269,-40126538,-55632255,-63463388,-60790011,-45843500,-18242759,20848867,68765249,121580021,174524316,222529022,260822498,285505769,294029020,285505769,260822498,222529022,174524316,121580021,68765249,20848867,-18242759,-45843500,-60790011,-63463388,-55632255,-40126538,-20393269,0,17844111,30685000,37088170,36741961,30395005,19647214,6633730,-6345307,-17191312,-24316004,-26849895,-24725447,-18630178,-9845027,0,9209864,16301406};//矩形窗-低通-截止频率为2000HZ*/
/*float fHn[FIRNUMBER]={4385199,-21652749,0,23146042,-5011656,-23774038,10558454,23380350,-16529809,-21807507,22798757,18891210,-29225438,-14448411,35661057,8254493,-41952202,0,47945373,-10794336,-53491585,24956346,58450876,-44079491,-62696582,71653236,66119236,-116901752,-68629953,213966342,70163187,-671235226,989502839,-671235226,70163187,213966342,-68629953,-116901752,66119236,71653236,-62696582,-44079491,58450876,24956346,-53491585,-10794336,47945373,0,-41952202,8254493,35661057,-14448411,-29225438,18891210,22798757,-21807507,-16529809,23380350,10558454,-23774038,-5011656,23146042,0,-21652749,4385199
};//矩形窗-高通-截止频率为8000HZ*/
/*float fHn[FIRNUMBER]={-9538698,5033186,0,-5380303,10901369,32674632,21449931,-25996592,-59477249,-32449821,33924813,67973998,
32495740,-29352537,-49011948,-17955197,9751798,0,-11144913,23479873,73517922,50699837,-64991479,-158605996,-93293235,106620840,237908995,129982959,-139424552,-294071690,-152619173,156028776,314350677,156028776,-152619173,-294071690,-139424552,129982959,237908995,106620840,-93293235,-158605996-64991479,50699837,73517922,23479873,-11144913,0,9751798,-17955197,-49011948,-29352537,32495740,67973998,33924813,-32449821,-59477249,-25996592,21449931,32674632,10901369,-5380303,0,5033186,-9538698};//矩形窗-带通-截止频率分别为4000HZ和6000HZ*/
/*float fHn[FIRNUMBER]={-290945,307040,0,-656431,1662544,5979764,4579795,-6343493,-16327341,-9897702,11382358,24879758,12885221,-12534175,-22424115,-8762585,5056567,0,-6458808,14323456,47090642,34021333,-45593858,-116105537,-71139736,84554657,195928093,111011133,-123327334,-269089380,-144308820,152291886,316410164,152291886,-144308820,-269089380,-123327334,111011133,195928093,84554657,-71139736,-116105537,-45593858,34021333,47090642,14323456,-6458808,0,5056567,-8762585,-22424115,-12534175,12885221,24879758,11382358,-9897702,-16327341,-6343493,4579795,5979764,1662544,-656431,0,307040,-290945
};//三角窗-带通-截止频率分别为4000HZ和6000HZ*/
/*floatfHn[FIRNUMBER]={505497,571185,0,-1221154,-2888554,-4600328,-5828195,-6032198,-4797831,-1967642,2262788,7310981,12252903,15950848,17251231,15224377,9406699,0,-12015279,-24886000,-36227584,-43295160,-43356425,-34117910,-14142427,16809284,57573973,105563471,156944954,207014767,250726453,283307635,300882930,283307635,250726453,207014767,156944954,105563471,57573973,16809284,-14142427,-34117910,-43356425,-43295160,-36227584,-24886000,-12015279,0,9406699,15224377,17251231,15950848,12252903,7310981,2262788,-1967642,-4797831,-6032198,-5828195,-4600328,-2888554,-1221154,0,571185,505497};//三角窗-低通-截止频率为2000HZ*/
/*float fHn[FIRNUMBER]={13600,-1343049,0,2871346,-777141,-4423876,
2292172,5800825,-4613803,-6763239,7777725,7030558,-11782925,-6273312,16589535,4095992,-22118334,0,28251990,-6695372,-34838023,17027560,41693427,-32809268,-48610782,57777387,55365641,-101514432,-61724906,199074418,67455869,-666152186,1012697467,-666152186,67455869,199074418,
-61724906,-101514432,55365641,57777387,-48610782,-32809268,41693427,17027560,-34838023,-6695372,28251990,0,-22118334,4095992,16589535,-6273312,-11782925,7030558,7777725,-6763239,-4613803,5800825,2292172,-4423876,-777141,2871346,0,-1343049,136000};//三角窗-高通-截止频率为8000HZ*/
/*float fHn[FIRNUMBER]={354949,-1801155,0,2337365,-583209,-3230861,
1682805,4362491,-3591280,-5475932,6561229,6176762,-10762379,-5942025,16245870,4133380,-22921097,0,30548925,-7355977,-38753080,19110559,47049184,-37098237,-54888573,64927608,61712024,-111854596,-67007120,212199197,70362374,-677639284,1001160992,-677639284,70362374,212199197,-67007120,-111854596,61712024,64927608,-54888573,-37098237,47049184,19110559,-38753080,-7355977,30548925,0,-22921097,4133380,16245870,-5942025,-10762379,6176762,6561229,-5475932,-3591280,4362491,1682805,-3230861,-583209,2337365,0,-1801155,354949};//海明窗-高通-截止频率为8000HZ*/
/*floatfHn[FIRNUMBER]={-692715,375638,0,-487467,1138184,3983956,3067242,-4351996,-11593666,-7310598,8759514,19940336,10736487,-10830501,-20032689-8066658,4780286,0,-6371100,14355843,47786201,34832727,-46935995,-119763600,-73278532,86681062,199223862,111585500,-122133566,-261661618,-137318423,141324373,285357838,141324373,-137318423,-261661618,-122133566,111585500,199223862,86681062,-73278532,-119763600,-46935995,34832727,47786201,14355843,-6371100,0,4780286,-8066658,-20032689,-10830501,10736487,19940336,8759514,-7310598,-11593666,-4351996,3067242,3983956,1138184,-487467,0,375638,-692715};//海明窗-带通-截止频率分别为4000HZ和6000HZ*/
/*float fHn[FIRNUMBER]={1271369,738178,0,-957936,-2088958,-3237644,
-4123308,-4371651,-3598820,-1535233,1839507,6189731,10784975,14559497,16279978,14805080,9393884,0,-12520041,-26347887,-38834443,-46825811,-47147966,-37176127,-15388570,18203115,61841590,112089439,164184768,212644718,252026319,277720788,286646563,277720788,252026319,212644718,
164184768,112089439,61841590,18203115,-15388570,-37176127,-47147966,-46825811,-38834443,-26347887,-12520041,0,9393884,14805080,16279978,14559497,10784975,6189731,1839507,-1535233,-3598820,-4371651,-4123308,-3237644,-2088958,-957936,0,738178,1271369};//海明窗-低通-截止频率为2000HZ*/
/*float fHn[FIRNUMBER]={15308281,8682063,0,-9348794,-17752396,-23639061,
-25752532,-23394095,-16588436,-6140126,6436605,19112642,29640752,35913963,36332671,30122850,17551737,0,-20130983,-39674160,-55086915,-62927241,-60351678,-45564301,-18149952,20761262,68529092,121241486,174131173,222119807,260419957,285115772,293644766,285115772,260419957,222119807,174131173,121241486,68529092,20761262,-18149952,-45564301,-60351678,-62927241,-55086915,-39674160,-20130983,0,17551737,30122850,36332671,35913963,29640752,19112642,6436605,-6140126,-16588436,-23394095,-25752532,-23639061,-17752396,-9348794,0,8682063,15308281};//凯塞窗-低通-截止频率为2000HZ*/
/*float fHn[FIRNUMBER]={4126578,-20454185,0,22024946,-4785426,-22776576,10147922,22540548,-15983197,-21146090,22167137,18415306,-28559292,-14152087,35007052,8120069,-41350367,0,47426845,-10694769,-53077036,24796812,58149711,-43901860,-62506940,71500076,66028767,-116817918,-68617310,214015633,70200132,-671707972,990258365,-671707972,70200132,214015633,
-68617310,-116817918,66028767,71500076,-62506940,-43901860,58149711,24796812,-53077036,-10694769,47426845,0,-41350367,8120069,35007052,-14152087,-28559292,18415306,22167137,-21146090,-15983197,22540548,10147922,-22776576,-4785426,22024946,0,-20454185,4126578};//凯塞窗-高通-截止频率为8000HZ*/
float fHn[FIRNUMBER]={-8921523,4725647,0,-5088549,10345930,31113245,20490463,-24910301,-57160469,-31274147,32784231,65858385,31561813,-28575587,-47820312,-17555315,9553411,0,-10957294,23121729,72504261,50069185,-64263159,-157005573,-92445046,105745502,236137702,129099325,-138550583,-292349506,-151770312,155188514,312676316,155188514,-151770312,-292349506,-138550583,129099325,236137702,105745502,-92445046,-157005573,
-64263159,50069185,72504261,23121729,-10957294,0,9553411,-17555315,-47820312,-28575587,31561813,65858385,32784231,-31274147,-57160469,-24910301,20490463,31113245,10345930,-5088549,0,4725647,-8921523};//凯塞窗-带通-截止频率分别为4000HZ和6000HZ*/
void InitADC();
void wait(unsigned int cycles);
void EnableAPLL();
unsigned int nADC0[NX],nADC1[NX];
main()
{
        int i;
        unsigned int uWork;
for(i=0;i<NX;i++)x[i]=0;
for(i=0;i<NH+2;i++)db[i]=0;
EnableAPLL();
SDRAM_init();
        InitCTR();
        InitADC();
PLL_Init(144);
        while(1)
        {
                for(i=0;i<NX;i++)
                {
                        ADCCTL=0x8000;        //启动AD转换,通道0
                        do
                        {
                                uWork=ADCDATA;
                        }while(uWork&0x8000);
                        nADC0[i]=uWork&0x0fff;
                        ADCCTL=0x9000;        //启动AD转换,通道1
                        do
                        {
                                uWork=ADCDATA;
                        }while(uWork&0x8000);
                        nADC1[i]=uWork&0x0fff;
                        uWork=(nADC0[i]+nADC1[i]);        //混频
                        uWork>>=1;//限幅,混频后仍然产生12位数据
                        x[i]=uWork;
                }
r=FIR();        //调用滤波程序计算当前输出
        }                                                        //在此加软件断点
}
void InitADC()
{
        ADCCLKCTL=0x23;//4MHz ADCLK
        ADCCLKDIV=0x4f00;
}
void wait(unsigned int cycles)
{
int i;
for(i=0;i<cycles;i++){}
}
void EnableAPLL()
{
wait(25);
*(ioport volatile unsigned short*)0x1f00=0;
*(ioport volatile unsigned short*)0x1f00=0x3000;
*(ioport volatile unsigned short*)0x1f00|=0x4F8;
wait(25);
*(ioport volatile unsigned short*)0x1f00|=2;
wait(30000);
*(ioport volatile unsigned short*)0x1e80=1;
wait(60000);
}
float FIR()
{
float fSum;
fSum=0;
for(i=0;i<FIRNUMBER;i++)
{
        fSum+=(fXn[i]*fHn[i]);
}
return(fSum);
}

评分

参与人数 1黑币 +40 收起 理由
admin + 40 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:1104358 发表于 2023-12-15 17:30 | 只看该作者
我也想找DSP/嵌入式软件高级工程师帮我解决问题,这个论坛有人擅长DSP/嵌入式吗?最近都在线活跃,高手请联系我,急需帮助。我们用的是德州仪器TMS320F280049C芯片,光伏微逆变器开发时高压并网遇到了问题。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表