变换-fftw使用的问题 频域抽取失败 高手请进~

问题描述

fftw使用的问题 频域抽取失败 高手请进~

int FFTw_IFFTw_Fun2(IN dDataArray* pRRIData, IN float fmin, IN float fmax, OUT dDataArray& VLFData)
{
try
{
int nSamples = pRRIData->m_nSamples;
int N = pRRIData->m_nLen;
int Nout = floor(N/2)+1;//实数据的DFT具有 Hermitian对称性,所以只需要计算n/2+1(向下取整)个输出就可以了。比如对于r2c,输入in有n个数据,输出out有floor(n /2)+1个数据。

    fftw_complex* out1;
    fftw_complex* out2;
    double* out3;
    out1 =  (fftw_complex *)fftw_malloc(sizeof(double)*Nout * 2);
    out2 =  (fftw_complex *)fftw_malloc(sizeof(double)*Nout * 2);
    out3 =  (double *)fftw_malloc(sizeof(double)*N);

    /////////////////////////fft变换/////////////////////////////////////////////////
    fftw_plan p = fftw_plan_dft_r2c_1d(N, pRRIData->m_pData, out1,  FFTW_ESTIMATE);
    fftw_execute(p);// 执行变换 ...
    fftw_destroy_plan(p);

    /////////////////////////频域抽取/////////////////////////////////////////////////
    float f1 = fmin;
    float f2 = fmax;

    float K = 0.0f;
    for (int m=0; m<Nout-1; m++)
    {
        K=m/(Nout/nSamples);
        if ((K < f1 || K > f2) || (K > (nSamples - f2) && K < (nSamples - f1)))//1/dt为一个频率周期
        {
            out2[m][0] = 0;
            out2[m][1] = 0;
        }
        else
        {
            out2[m][0] = out1[m][0];
            out2[m][1] = out1[m][1];
        }
    }

    //////////////////////////////////IFFT变换////////////////////////////////////////
    fftw_plan  c2cP;
    c2cP = fftw_plan_dft_c2r_1d( N, out2, out3,  FFTW_ESTIMATE);//需注意FFTW的逆变换没有除以N,即数据正变换再反变换后是原始数据的N倍。
    fftw_execute(c2cP);
    fftw_destroy_plan(c2cP);

    VLFData.m_nLen = N;
    VLFData.m_nSamples = 2;
    VLFData.m_pData = new double[VLFData.m_nLen];
    memset(VLFData.m_pData,0,sizeof(double)*VLFData.m_nLen);

    for (int i=0; i< N; i++)
    {
        VLFData.m_pData[i] = out3[i]/N;//取实数
    }

    fftw_free(out1);
    fftw_free(out2);
    fftw_free(out3);
    TRACE(_T("int  FFTw_IFFTw_Fun2 函数返回1~"));
    return 1;
}
catch (...)
{
    TRACE(_T("int  FFTw_IFFTw_Fun2 函数catch到错误~"));
    return -1;
}

}

        float fmin = 0.0f;
        float fmax = 0.0033f;
        dataOutput.VLFData.Init();
        FFTw_IFFTw_Fun2(&dataOutput.RRIData, fmin, fmax, dataOutput.VLFData);

出来的波形跟原始数据波形极其相似,我用matlab频域抽取的话,是正确的,用C++实现就出了问题。

解决方案

找到了!这一行出了问题,K=m/(Nout/nSamples); C++默认=右侧为整形数据 整形赋值给float类型,float没有起到相应的作用,仍然为整形数据。所以抽取频域数据的时候出现了问题~改为K=1.0*m/(Nout/nSamples); 即可

解决方案二:

自己顶~

时间: 2024-11-02 23:26:08

变换-fftw使用的问题 频域抽取失败 高手请进~的相关文章

kettle-Kettle抽取失败后重新抽取漏抽数据

问题描述 Kettle抽取失败后重新抽取漏抽数据 请问各位大神,如果有某种原因使得每天抽一次的kettle抽取挂了,那么后面几天内时间没有抽取的数据,你们是怎么处理的 解决方案 Kettle数据抽取---增量抽取

不能连接数据库-weblogic部署web项目报:连接数据库失败,请检查系统数据库连接配置

问题描述 weblogic部署web项目报:连接数据库失败,请检查系统数据库连接配置 2C youngtop.sys.exception.YoungtopException: 系统错误:youngtop.sys.exception.YoungtopException: 数据库操作错误:errcode=17002sqlstate=08006java.sql.SQLRecoverableException: IO 错误: Software caused connection abort: socke

Win8登陆迅游加速器提示“登录请求失败,请稍后重试”如何解决

Win8登陆迅游加速器提示"登录请求失败,请稍后重试"如何解决   解决办法: 1.网上邻居-右键属性(注:Vista/Win7系统请点击"网络和共享中心"左侧的"管理网络连接/更改适配器设置"); 2.本地连接-右键属性-Internet协议(TCP/IP4)属性中选中"使用下面的DNS服务器地址"; 3.在"首选DNS服务器"中,网通/联通/电信用户填"211.157.15.189"

ssl-python:POPlib模块写一个接受邮件的程序,显示登陆失败,请使用安全连接SSL

问题描述 python:POPlib模块写一个接受邮件的程序,显示登陆失败,请使用安全连接SSL 解决方案 接收方是qq邮箱..... 解决方案二: 在qq邮箱里要配置一下,使用ssl连接

xmlentities-在xml文档中插入图片总是失败,请大家帮我看看这段代码错在哪里了?

问题描述 在xml文档中插入图片总是失败,请大家帮我看看这段代码错在哪里了? <?xml version="1.0" encoding="GB2312"?> <!DOCTYPE photos[ <!ELEMENT photos (photo*)> <!ELEMENT photo EMPTY> <!ATTLIST photo Sources ENTITIES #REQUIRED> <!ENTITY ic1 S

update-升级失败,请高手指点。怎么办?

问题描述 升级失败,请高手指点.怎么办? start updater-binaryupdate type=3--Liuinstall_type=3--Liuabout to run program [/system/bin/toolbox] with 5 args6291456+0 records in6291456+0 records out3221225472 bytes transferred in 637.613 secs (5052007 bytes/sec)about to run

maven项目使用jetty启动,启动失败,请大神帮忙看看

问题描述 maven项目使用jetty启动,启动失败,请大神帮忙看看 14:50:16.256 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'webMapperScannerConfigurer'2015-07-08 14:50:16.535:WARN::Failed startup of context org.mortbay.jetty.webapp.WebApp

微信公众平台开发-微信公众平台开(echostr校验失败,请您检查是否正确解密并输出明文echost)

问题描述 微信公众平台开(echostr校验失败,请您检查是否正确解密并输出明文echost) 开发-微信公众平台开(echostr校验失败,请您检查是否正确解密并输出明文echost)-echostr校验失败">企业号开启回调模式 echostr校验失败,请您检查是否正确解密并输出明文echostr 在新浪日志中看到签名验证失败,ase解密失败 .大牛们能不能解决呀.用的是Java 开发 解决方案 这个能解决么:http://www.cnblogs.com/txw1958/p/token

centos7安装PHP5.6.20失败,请帮助!

问题描述 centos7安装PHP5.6.20失败,请帮助! configure成功,make的时候失败: /bin/ld: ext/openssl/.libs/openssl.o: undefined reference to symbol 'X509_PURPOSE_get_count@@libcrypto.so.10' /bin/ld: note: 'X509_PURPOSE_get_count@@libcrypto.so.10' is defined in DSO /usr/lib64/