Спектр сигнала БПФ

В настоящее время я работаю над реализацией диаграммы спектра сигналов.
Мои входные данные: 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;
}

введите описание изображения здесь

1

Решение

Вот несколько вещей, которые не совсем верны:

  • На графике во временной области 100 точек с частотой дискретизации 1000 Гц должны дать вам общую длительность 0,1 секунды. Формула, используемая для signalX правильно, если предположить, что timePassed 0,1 секунды. Вы должны выяснить, почему эта переменная на самом деле составляет около 0,4 секунды.
  • Поскольку у вас есть 8 полных циклов за 0,1 секунды, вы должны получить пиковую частоту 8 * 1 / 0,1 = 80 Гц. Таким образом, очевидно, что что-то не так с масштабированием оси X спектрограммы. Более конкретно, приращения частоты должны быть установлены на 1000/np или 10 Гц с np == 10, Это создаст график до 500 Гц, что составляет половину частоты дискретизации (в соответствии с теоремой Найквиста), где пик будет отображаться на правильной частоте 80 Гц.
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]