В настоящее время я работаю над реализацией диаграммы спектра сигналов.
Мои входные данные: 1,051, 1.365, 1.837, 2.334, 2.486, 2.688, 2.878, 2.579, 2.11, 1.605, 0.936, 0.73, 1.036, 1.336, 1.796, 2.043, 2.462, 2.935, 2.892, 2.609, 2.151, 1.641, 0.961, 0,738, 0,767, 1.303, 1.503, 2.004, 2.435, 2.931, 2.908, 2.641, 1.935, 1.423, 0.988, 0.747, 0.755, 1.018, 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,444, 2,015, 1,501, 1,302, 1,025, 0,739, 0,962, 1,664, 2,144, 2,605, 2,895, 2,935, 2,467, 2,3304, 1,779, 1,333, 1,039, 0,732, 0,936, 1,608, 2,103, 2,575, 2,88, 2,688, 2,493, 2,334, 1,835, 1,35, 1,054, 0,725, 0,913, 1,568, 2,067, 2,288, 2,867, 2,69, 2,516, 2,337, 1,877, 1,397, 1,072, 0,721, 1,144, 1,277, 1,77
Вы можете увидеть эти данные на моем скриншоте. Это нижняя диаграмма. Он содержит только 100 баллов. И невозможно увеличить его количество.
Частота входного сигнала составляет 1000 Гц. И это можно изменить.
Я использую FFTW, чтобы получить спектр.
Частота входного сигнала составляет 1000 Гц. На верхней диаграмме он показывает только около 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;
}
Вот несколько вещей, которые не совсем верны:
signalX
правильно, если предположить, что timePassed
0,1 секунды. Вы должны выяснить, почему эта переменная на самом деле составляет около 0,4 секунды.1000/np
или 10 Гц с np == 10
, Это создаст график до 500 Гц, что составляет половину частоты дискретизации (в соответствии с теоремой Найквиста), где пик будет отображаться на правильной частоте 80 Гц.Других решений пока нет …