|
本帖最后由 shentqlf 于 2017-8-18 11:31 编辑
eBox最新支持Fir滤波器,支持低通、高通、带通、带阻四种模式。
最重要的是他不需要FDAtool计算参数表。自带了参数的计算工具。而且支持多种窗体RECTANGULAR, BARTLETT, HANNING, HAMMING, BLACKMAN
首先要感谢:http://www.labbookpages.co.uk/audio/firWindowing.html
这个库真是太好用了,网上看了各种代码,都觉得不太好,从GitHub上找到了一份代码,顺便找到了那个愿网址,看到这个代码后觉得非常厉害!果断移植。
-
- int kaiserWindowLength;
- float sampFreq = 1000;//采样率
-
- // Low and high pass filters
- float transFreq1 = 20;
- float transFreq2 = 70;
- //设定滤波器特性,0.01:ripple;10: transition band width;sampFreq:采样率
- //该函数会根据前两个值得设定,计算出滤波器阶数。
- fir.calculateKaiserParams(0.01, 10, sampFreq, &kaiserWindowLength, &beta);
- //根据生成的窗口长度,初始化一个自己想要的滤波器
- // float *lpf = fir.create1TransSinc(kaiserWindowLength, transFreq1, sampFreq, LOW_PASS);
- float *lpf = fir.create1TransSinc(kaiserWindowLength, transFreq1, sampFreq, HIGH_PASS);
- // float *lpf = fir.create2TransSinc(kaiserWindowLength, transFreq1,transFreq2, sampFreq, BAND_PASS);
- // float *lpf = fir.create2TransSinc(kaiserWindowLength, transFreq1,transFreq2, sampFreq, BAND_STOP);
- float *lpf_kaiser = fir.createKaiserWindow(lpf, NULL, kaiserWindowLength, beta);
- uart1.printf("kaiserWindowLength = %d\r\n",kaiserWindowLength);
- uart1.printf("beta = %d\r\n",beta);
- //使用Kaiser Window数据设置滤波器的参数。
- fir.set(lpf_kaiser,kaiserWindowLength);
复制代码
fir.calculateKaiserParams(0.01, 10, sampFreq, &kaiserWindowLength, &beta);
float *lpf_kaiser = fir.createKaiserWindow(lpf, NULL, kaiserWindowLength, beta);
生成一个信号
- for(int i = 0; i < LEN;i++)
- in_signal[i] =50 + 10.0*sin( 2*PI *50* i * 1e-3) + 10.0*sin( 2*PI *10* i * 1e-3) ;
复制代码
查看动态内存剩余量
- uart1.printf("mem : %d\r\n",ebox_get_free());
复制代码
- start = micros();
- for(int i = 0; i < LEN; i++)
- out_signal[i] = fir.in(in_signal[i]);//将数据依次输入滤波器,同时将输出的数据保存
- end = micros();
- uart1.printf("micros per calculation = %0.1fus\r\n",(end - start)/1000.0);//计算当前滤波器的一次计算所需时间
- for(int i = 0; i < LEN; i++)
- {
- out_signal[i] = fir.in(in_signal[i]);
- uart1.printf("%d\t",in_signal[i]); //打印输入数据
- uart1.printf("%d\t",out_signal[i]); //打印输出数据
- uart1.println();
- }
复制代码
将数据拷贝到Excel表格。做出图形。
高通滤波器输出结果
高于20Hz信号输出
低通滤波器输出结果
低于20Hz输出
带通滤波器
20Hz-70Hz之间的信号通过
带阻滤波器
20Hz-70Hz之间的信号不能通过
带阻滤波器
5Hz-70Hz之间的信号不能通过
关于内存占用量
内存占用量和滤波器所使用的阶数( 即kaiserWindowLength)的大小有关:
kaiserWindowLength = 225
mem : 3920bytes
kaiserWindowLength = 113
mem : 2128bytes
kaiserWindowLength = 76
mem : 1520bytes
优化后基本上内存占用量减少一半。
关于计算量
上传eBox_V2.0完整代码:
大家不要只记得下载哦,去GitHub点个star哦!
eBox最新代码请关注:
eBox_STM32F1
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|