Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ FFTW信号频谱_C++_Signals_Fft_Fftw_Spectrum - Fatal编程技术网

C++ FFTW信号频谱

C++ FFTW信号频谱,c++,signals,fft,fftw,spectrum,C++,Signals,Fft,Fftw,Spectrum,我目前正致力于实现信号频谱图。 我的输入数据是:1.051,1.365,1.365,1.837,1.837,2.334,2.486,2.688,2.878,2.579,2.11,1.605,1.11,1.11,1.1,1.1,1.051,1.051,1.051,1.051,1.1,1,1.1,1,1.11,1,1.1,1,1.605,1,1,1.11,1.11,1,1,1.11,1,1.605,1,1,0 0 0 0 0 0,0 0,0,1.11,0,1.11,1,1.605,0,0 0 0 0

我目前正致力于实现信号频谱图。 我的输入数据是:1.051,1.365,1.365,1.837,1.837,2.334,2.486,2.688,2.878,2.579,2.11,1.605,1.11,1.11,1.1,1.1,1.051,1.051,1.051,1.051,1.1,1,1.1,1,1.11,1,1.1,1,1.605,1,1,1.11,1.11,1,1,1.11,1,1.605,1,1,0 0 0 0 0 0,0 0,0,1.11,0,1.11,1,1.605,0,0 0 0 0,0 0 0,0 0,0 0 0 0 0 0,0 0,0 0 0 0,0,0 0 0 0 0 0 0 0 0 0 0,0,1.6,0 0 0 0 1.465,1.966,2.662,2.919,2.918,2.669,1.976,1.462,1.017,0.757, 0.746, 0.989, 1.426, 1.927, 2.637, 2.908, 2.927, 2.441, 2.015, 1.501, 1.302, 1.025, 0.739, 0.962, 1.644, 2.144, 2.605, 2.895, 2.935, 2.467, 2.304, 1.797, 1.331, 1.039, 0.732, 0.936, 1.608, 2.103, 2.575, 2.88, 2.688, 2.493, 2.343, 1.835, 1.365, 1.054, 0.725, 0.913, 1.568, 2.067, 2.288, 2.867, 2.69, 2.516, 2.379, 1.877, 1.397, 1.072, 0.721, 1.144,1.277,1.77

你可以在我的截图上看到这些数据。这是底部图表。它只包含100个点。而且不可能增加其数量

输入信号频率为1000 Hz。这是可以改变的

我使用FFTW来获取频谱

输入信号频率为1000 Hz。在上面的图表上,它只显示了大约200赫兹。这是主要问题。我想可能是我的代码错了,或者分数不够

我的数据分析代码:

    QVectorDouble points(100);
    points = this->reader->ReadCOM(100);
    double timePassed = this->reader->timePassed;
    unsigned int n = points.count();
    double timeShift = timePassed / n;

    QVectorDouble signalX(n), signalY(n);

    for (unsigned int i = 0; i < n; i++)
    {
        signalX[i] = i*timeShift; // x goes from 0 to  timePassed to take points amount
        signalY[i] = points[i];
    }

    fftw::maxthreads = get_max_threads();
    unsigned int np = n / 2 + 1;
    size_t align = sizeof(Complex);

    array1<Complex> F(np, align);
    array1<double> f(n, align);

    rcfft1d Forward(n, f, F);

    for(unsigned int i = 0; i < n; i++) {
        f[i] = points[i];
    }

    Forward.fft(f, F);

    QVectorDouble spectrX(np), spectrY(np);
    for (int i = 0; i < np; i++)
    {
      spectrX[i] = i * 20; //multiply by 20 because np is (100/2 + 1) and chart maximum xOrigin is 1000
      spectrY[i] = abs(F[i]) / np;
    }
QVectorDouble points(100);
点数=此->读卡器->读卡器(100);
double timePassed=此->读卡器->timePassed;
无符号整数n=points.count();
双时间档=时间通过/n;
qvectorx(n),signalY(n);
for(无符号整数i=0;i

以下是一些不太正确的事情:

  • 在时域图中,采样率为1000Hz的100个点的总持续时间应为0.1秒。假设
    timePassed
    为0.1秒,则用于
    signalX
    的公式是正确的。您应该了解为什么该变量实际上约为0.4秒
  • 由于在0.1秒内有8个完整的周期,因此应获得8*1/0.1=80Hz的峰值频率。所以,很明显,光谱图的x轴比例有问题。更具体地说,频率增量应设置为
    1000/np
    或10Hz,且
    np==10
    。这将生成一个高达500Hz的图,这是采样率的一半(与奈奎斯特定理一致),其中峰值将显示在正确的80Hz频率

    • 以下是一些不太正确的事情:

      • 在时域图中,采样率为1000Hz的100个点的总持续时间应为0.1秒。假设
        timePassed
        为0.1秒,则用于
        signalX
        的公式是正确的。您应该了解为什么该变量实际上约为0.4秒
      • 由于在0.1秒内有8个完整的周期,因此应获得8*1/0.1=80Hz的峰值频率。所以,很明显,光谱图的x轴比例有问题。更具体地说,频率增量应设置为
        1000/np
        或10Hz,且
        np==10
        。这将生成一个高达500Hz的图,这是采样率的一半(与奈奎斯特定理一致),其中峰值将显示在正确的80Hz频率

      “我做得对吗”的含义相当广泛-您是否有证据表明存在/不存在特定问题?输入信号频率为1000 Hz。在ttop图表上,它仅显示约200 Hz。这是主要问题)我想可能是我的代码错了,或者点数不够。你最好改变fft图x轴上的单位。现在,似乎您正在绘制fft箱号,而实际上您希望绘制特定箱号的频率。@TarasNikulin似乎OP正在运行长度为1024的fft,并使用箱号作为x-axis@AlexZywicki1000这是我自己设定的范围“我做得对吗?”非常广泛-您是否有证据表明存在/不存在特定问题?输入信号频率为1000 Hz。在ttop图表上,它仅显示约200 Hz。这是主要问题)我想可能是我的代码错了,或者点数不够。你最好改变fft图x轴上的单位。现在,似乎您正在绘制fft箱号,而实际上您希望绘制特定箱号的频率。@TarasNikulin似乎OP正在运行长度为1024的fft,并使用箱号作为x-axis@AlexZywicki这是我自己设置的范围