你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F0 ADC采样128点进行FFT,转换结果分析

[复制链接]
javel 提问时间:2017-8-10 14:51 /
      各位高手,现在用STM32F0的ADC采样一组不规则信号,128个点,200HZ采样;采样数据经过MTLAB验证,FFT转换结果跟keil运行输出结果一致,说明FFT程序正确。现在经过FFT转换输出的128个模数(x[i].real=sqrt(x[i].real*x[i].real+x[i].img*x[i].img);),取了64个数据转换功率来分析(根据FFT对称性),把64个功率数据由串口输出,从串口数据来看,在不规则信号幅度低的时候,输出数据如下:(35 10 15 18 20 0F 00 0C 19 1F 15 12 10 0F 06 0C 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00);
在不规则信号幅度高的时候,输出数据如下:(35 1C 25 19 29 23 19 16 1B 26 2B 28 2D 29 20 28 13 22 24 18 21 10 21 1B 1C 24 1A 19 1F 13 1A 17 17 18 18 18 1A 14 13 15 17 1A 19 1B 14 13 16 15 16 0D 09 10 14 15 0C 1A 17 10 13 0C 09 06 09);
     观察数据发现:输入信号幅度低时,在64个点对应频率0-25HZ以后,各个频点对应功率全部为0;而信号强的输出数据,64个频点对应的功率都大于0。 对于这64个数据,是不是输入信号幅度越高,FFT转换后的对于功率就越大?要分析原始波形的幅度,是不是看这64点功率就可以一一对应判断了?对这64个数据还需要进行什么分析才知道原始波形高点的频率和幅度?



//5ms采1个点,128个点,采样频率F=200Hz
//FFT结果的128个数据对应频率点是:0,1*200Hz/128,2*200Hz/128,3*200Hz/128, 。。。 ,127*200Hz/128 (0->127)
//N=128
//频率点表:
//          0.00->  1.5625 ->  3.125- >  4.6875 ->  6.25 ->  7.8125 ->  9.375 -> 10.9375-> //8PCS
//          12.5 -> 14.0625-> 15.625-> 17.1875-> 18.75-> 20.3125-> 21.875-> 23.4375-> //8pcs
//          25.00-> 25.5626-> 28.125-> 29.6875-> 31.25-> 32.8125-> 34.375-> 35.9375-> //8PCS
//          37.5 -> 39.0625-> 40.625-> 42.1875-> 43.75-> 45.3125-> 46.875-> 48.4375-> //8pcs


收藏 2 评论9 发布时间:2017-8-10 14:51

举报

9个回答
javel 回答时间:2017-8-11 12:09:49
请问高频信号,经FFT后,得到的模值和频点,怎么处理才知道原始信号的相关参数?
javel 回答时间:2017-8-11 13:35:40
% MTLAB 显示出ADC采样128个点对应波形
%---------------------------------------------------------------------------------
clear;
close all;     %128点ADC采样最大幅度波形
fs=200;        %采样频率
N=128;         %采样数据点数
n=0:N-1;       %采样序列(0->128)
t=n/fs;        %时间序列(0->128/200)
%---------------------------------------------------------------------------------
xn=[729 729 728 732 733 727 729 727 727 728 730 730  76 2 1 1 729 729 730 727 726 726 727 728 727 708 ...
319 3 1 403 730 597 0 1 2 1 18 1 1 0 0 0 454 727 729 733 734 728 729 723 727 732 643 3 2 3 0 0 2 564 ...
729 726 729 727 729 730 731 730 730 730 729 645 2 0 0 0 0 0 1 0 0 4 0 1 1 1 2 4 730 729  730 730 728 ...
728 727 729 724 726 725 728 726 727 726 728 732 729 724 727 728 730 729 723 726 728 729 727 729 728 ...
729 728 727 732 731 281 1 1 1 0];
%---------------------------------------------------------------------------------
subplot(2,2,1),plot(t,xn);   %绘出原始信号图
xlabel('时间/sec');          % x轴为时间
title('最大幅度原始信号');    %标题:最大幅度原始信号图
y=fft(xn);            %对输入信号做 FFT 变换
mag=abs(y);           %求 FFT 转换结果的模值,即振幅
Ayy = mag/(N/2);      %模换算成实际的幅度=该点复数的模值除以N/2
f=(0:N-1)*fs/N;       %真实频率
subplot(2,2,3),plot(f,Ayy);   %绘出FFT转换后实际的幅度图
xlabel('频率/Hz');            % x轴为频率
title('FFT转换后的实际幅度');  %标题:FFT转换后的实际幅度图
%---------------------------------------------------------------------------------
%%%%%%%% 128点ADC采样小型幅度波形
yn=[449 449 443 444 443 444 443 444 444 434 426 420 420 426 435 443 453 473 491 508 516 526 540 558 574 ...
577 574 571 574 582 588 605 613 611 604 587 569 548 527 507 472 429 388 351 312 284 276 283 298 318 332 ...
345 362 383 410 446 471 484 484 486 501 525 547 564 573 576 573 570 576 588 600 608 598 589 565 544 534 ...
537 562 583 595 587 558 533 509 493 482 482 481 487 493 508 522 541 549 547 543 545 550 551 554 554 565 ...
579 597 602 604 599 594 583 568 545 530 514 501 503 512 524 532 541 536 537 538 537 544 545 538 534];
%---------------------------------------------------------------------------------
subplot(2,2,2),plot(t,yn);   %绘出原始信号图
xlabel('时间/sec');          % x轴为时间
title('小型幅度原始信号');   %标题:小型幅度原始信号图
z=fft(yn);            %对输入信号做 FFT 变换
maf=abs(z);           %求 FFT 转换结果的模值,即振幅
Byy = maf/(N/2);      %模换算成实际的幅度=该点复数的模值除以N/2
f=(0:N-1)*fs/N;       %真实频率
subplot(2,2,4),plot(f,Byy);   %绘出FFT转换后实际的幅度图
xlabel('频率/Hz');            % x轴为频率
title('FFT转换后的实际幅度');  %标题:FFT转换后的实际幅度图

MTLAB验证

MTLAB验证
javel 回答时间:2017-8-11 13:36:59
请各位不吝赐教,在此感谢
无薪税绵 回答时间:2017-10-25 11:24:19
不知道楼主有没有对采样数据*2呢?
因为,采样频率要大于信号频率的两倍,才能恢复出实际波形。

以下提供圈圈大神的详细解释:
http://www.eeworld.com.cn/Test_a ... /article_12114.html

评分

参与人数 1ST金币 +3 收起 理由
zero99 + 3

查看全部评分

无薪税绵 回答时间:2017-10-25 11:24:39
本帖最后由 无薪税绵 于 2017-10-25 11:42 编辑

不知道楼主有没有对采样数据*2呢?
因为,采样频率要大于信号频率的两倍,才能恢复出实际波形。

以下提供圈圈大神的详细解释:
http://www.eeworld.com.cn/Test_a ... /article_12114.html

再提供一份:FFT后的物理意义
http://www.xuebuyuan.com/539160.html

刚发现,这个解释才牛:
http://zhuanlan.zhihu.com/wille/19763358
qhwan_love 回答时间:2018-3-1 14:18:59
请问楼主是用DSP库的吗?STM32F0的DSP库在哪里可以下载?
板子粉丝 回答时间:2018-3-2 08:45:36
楼主讲得详细
kirbymore 回答时间:2018-3-2 15:03:02
可能现在都是一些菜鸟在逛论坛了,没人回复了
楼主解决问题了,和大家共享一下经验啊
lewe 回答时间:2019-8-19 09:50:23
请教一下:我这样计算出来的值是不是对的?为什么每个频率上都有值啊?
fft2.png
程序是这样子:
用ADC采集值填入fft输入buff
void ADC_proc(void)
{
    uint16_t ai,cnt;
        
    if(adc_conv_done)
    {
       adc_conv_done = 0;


            for(ai=0;ai<NPT;ai++)
                {
                      lbufin[ai*2] = (float)(adc_buf[ai*2]-2048);
                          lbufin[ai*2+1] = (float)0;
                }
          FFT_proc();      
         HAL_ADC_Start_DMA(&hadc,(uint32_t*)adc_buf,sizeof(adc_buf)/2);
    }
}



FFT处理



float  lbufin[NPT*2];                                                           /* Complex input vector */
float  lbufout[NPT];                                                          /* Complex output vector */
float  lbufmag;                                                                  /* Magnitude vector */
uint16_t fftSize = 64;


uint8_t ifftFlag = 0;
uint8_t doBitReverse = 1;
uint16_t audio_mag;
extern  uint8_t  audio_intf_flag;
//uint32_t refIndex = 213,
uint32_t testIndex = 0;
__IO uint8_t  new_mag_flag;


void FFT_proc()
{                     
    arm_cfft_f32(&arm_cfft_sR_f32_len64, lbufin, ifftFlag, doBitReverse);
        arm_cmplx_mag_f32(lbufin,lbufout,fftSize);
    arm_max_f32(lbufout, NPT, &lbufmag, &testIndex);
}  


关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版