搜索
bottom↓
回复: 7

STM32 两路ADC采样Sensor信号+DFT计算

[复制链接]

出0入0汤圆

发表于 2012-12-25 17:06:21 | 显示全部楼层 |阅读模式
本人现在正在用STM32 的ADC来采样两路SENSOR信号,分别用ADC完成中断和ADC DMA传输完成中断。。。
================
DFT 刚刚接触,也刚刚接触算法问题。。。。

思路如下:
两adc利用中断得到数据---》然后吧数据做成数组buff ---》 然后在主循环中做DFT运算-------------------------说真的DFT 这个函数不知道如何设计来完成他!以下是我从上位机VB移植过来DFT处理程序。

double DFT_OLD(short dir,int16_t dwADSample,double saBuffera[],double saBufferb[])
{          
        
        static double t=0;           
        static double Loff=0,Qoff=0,SumLC=0,SumLS=0,SumQC=0,SumQS=0,LdAvg,RefAvg,gsd33FFtTotal;   
        static double LdPhase,RefPhase,LdTotal,RefTotal,LdTtl,RefTtl;
                static int16_t i,m=0;
                m=(dwADSample/2)-1;
                //flag=0;
                //delay_ms(10);

        for (i=0;i<m;i++)
        {   
   
                        t = i * 0.0002006004;
                        //for any offsets
                        Loff = Loff + saBuffera[i];      //for Load Cell input Raw Data.
                        Qoff = Qoff + saBufferb[i];      //for Probe input Raw Data.
                        //convert (load) to cosine and sine.
                        SumLC = (SumLC + saBuffera[i] * (cos(FREQ * t)));
                        SumLS = (SumLS + saBuffera[i] * (sin(FREQ * t)));
                        //convert (charge amp.) to cosine and sine.
                        SumQC = (SumQC + saBufferb[i] * (cos(FREQ * t)));
                        SumQS = (SumQS + saBufferb[i] * (sin(FREQ * t)));

                }
                //flag=1;
                LdAvg = Loff / (dwADSample / 2);        //offset for load cell
                RefAvg = Qoff / (dwADSample / 2);        //offset for charge amp (probe)
       
                // to get the total
                LdTtl = ((sqrt(SumLC*SumLC +  SumLS*SumLS)) / (dwADSample / 2));
                RefTtl = ((sqrt(SumQC*SumQC + SumQS*SumQS)) / (dwADSample / 2));
               
                //convert totals into voltages
                //    LdAvg = (LdAvg * 0.00015259) '(0.0012207) * 0.123)
                //    RefAvg = (RefAvg * 0.000015259) '(0.0012207) * 0.0123)
                //    LdTotal = (LdTtl * 0.0001529)
                //    RefTotal = (RefTtl * 0.0001529) - RefAvg
                LdTotal = LdTtl;
                RefTotal = RefTtl - RefAvg;

                 // to find the phase angle
        LdPhase = atan(SumLS / SumLC);  //phase angle of load cell
        RefPhase = atan(SumQS / SumQC); //phase angle of charge amp (probe)
  
        if ((Sgn(SumLS) == 1)&&(Sgn(SumLC) == -1 ))
                 LdPhase = LdPhase - 3.14159265;
        if ((Sgn(SumLS) == -1)&&( Sgn(SumLC) == -1 ))
                 LdPhase = LdPhase + 3.14159265;
      
                if ((Sgn(SumQS) == 1)&&(Sgn(SumQC) == -1))
                    RefPhase = RefPhase - 3.14159265;
                if ((Sgn(SumQS) == -1) &&( Sgn(SumQC) == -1 ))
                    RefPhase = RefPhase + 3.14159265;
   
        //using the phase to find the polarity of the film
        if ((fabs(LdPhase - RefPhase) > 1.57079632) && (fabs(LdPhase - RefPhase) < (3 * 1.57079632)))
        gsd33FFtTotal = -1 * ((RefTotal / LdTotal) * 22.49718785);      //RefTtl + LdTtl are Calibration Factors                                                   
        else
        gsd33FFtTotal = ((RefTotal / LdTotal) * 22.49718785);
        if(dir==1)
                return (LdAvg);
            else
                return (gsd33FFtTotal);
  }   

但在实际中,按照上述思路设计。STM32的RAM不够了。 我用DFT取点为4096点。。。。超出RAM.................
还请有哪位大虾指教下!!!TKS

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2018-4-14 20:50:17 | 显示全部楼层
不懂帮顶~~

出0入0汤圆

发表于 2018-4-14 21:20:49 | 显示全部楼层
牺牲点精度,把点数取少一点试试。

出10入23汤圆

发表于 2018-4-14 21:29:41 来自手机 | 显示全部楼层
这坟挖到姥姥家了

出0入0汤圆

发表于 2018-4-14 21:57:03 | 显示全部楼层
直接做DFT的话建议使用浮点库CMSIS

出0入0汤圆

发表于 2019-1-15 15:39:39 | 显示全部楼层
Jacky.Qiu 发表于 2018-4-14 21:57
直接做DFT的话建议使用浮点库CMSIS

CMSIS有DFT的库吗?我下载的怎么只有FFT的库呢,请指点,也想用DFT

出0入8汤圆

发表于 2019-4-4 18:19:12 来自手机 | 显示全部楼层
哇哈,正需要,再挖出来

出0入0汤圆

发表于 2019-4-4 22:56:32 | 显示全部楼层
点数少一半,然后采用定点FFT, 一路实路转换成两路虚实并用的复数,这样,空间节省了4倍
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 02:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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