C++ FFTW信号频谱
我目前正致力于实现信号频谱图。 我的输入数据是: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赫兹。这是主要问题。我想可能是我的代码错了,或者分数不够 我的数据分析代码: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
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秒。假设
为0.1秒,则用于timePassed
的公式是正确的。您应该了解为什么该变量实际上约为0.4秒signalX
- 由于在0.1秒内有8个完整的周期,因此应获得8*1/0.1=80Hz的峰值频率。所以,很明显,光谱图的x轴比例有问题。更具体地说,频率增量应设置为
或10Hz,且1000/np
。这将生成一个高达500Hz的图,这是采样率的一半(与奈奎斯特定理一致),其中峰值将显示在正确的80Hz频率np==10
- 在时域图中,采样率为1000Hz的100个点的总持续时间应为0.1秒。假设
为0.1秒,则用于timePassed
的公式是正确的。您应该了解为什么该变量实际上约为0.4秒signalX
- 由于在0.1秒内有8个完整的周期,因此应获得8*1/0.1=80Hz的峰值频率。所以,很明显,光谱图的x轴比例有问题。更具体地说,频率增量应设置为
或10Hz,且1000/np
。这将生成一个高达500Hz的图,这是采样率的一半(与奈奎斯特定理一致),其中峰值将显示在正确的80Hz频率np==10
- 以下是一些不太正确的事情: