Странный спектр БПФ от почти идеальной синусоиды

#signal-processing #fft

#обработка сигнала #БПФ

Вопрос:

Я извлек некоторый сигнал в моем моделировании Abaqus для целей проверки. Истинный сигнал должен быть идеальной синусоидой при частоте 300 кГц, и я выполнил БПФ для дискретизированного сигнала, используя scipy.fftpack.fft .

Но я получил странный спектр, как показано ниже (извините, что я слишком ленив, чтобы масштабировать ось x спектра до правильной частоты). На том же рисунке я разрезал сигнал на части и построил график во временной области. Я также повторил тот же процесс для чистой синусоидальной волны. введите описание изображения здесьЭто меня полностью удивляет. Как указано ниже в коде, частота дискретизации составляет 16,66 х от частоты сигнала. На данный момент я думаю, что это связано с очень небольшой ошибкой в периоде дискретизации. Теоретически, Abaqus должен отбирать его через регулярный интервал времени. Как вы можете видеть, есть небольшая ошибка, из-за которой точки в моем сигнале кажутся толще, чем в идеальном сигнале. Но дает ли такая небольшая ошибка разительную разницу в частотном спектре? В противном случае, почему частотный спектр такой?


FYI1: Это увеличенный спектр БПФ моего сигнала: введите описание изображения здесь

FYI2: Это код python, который использовался для создания приведенных выше рисунков

 def myfft(x, k, label):
    plt.plot(np.abs(fft(x))[0:k], label = label)
    plt.legend()

plt.subplot(4,1,1)
for i in range(149800//200):
    plt.plot(mysignal[200*i:200*(i 1)], 'bo')
plt.subplot(4,1,2)
myfft(mysignal,150000//2, 'fft of my signal')
plt.subplot(4,1,3)
[Fs,f, sample] =  [5e6,300000, 150000]
x = np.arange(sample)
y = np.sin(2 * np.pi * f * x / Fs)
for i in range(149800//200):
    plt.plot(y[200*i:200*(i 1)], 'bo')
plt.subplot(4,1,4)
myfft(y,150000//2, 'fft of a perfect signal')
plt.subplots_adjust(top = 2, right = 2)
  

FYI3: Вот мой сигнал в формате .npy and .txt . Сигнал довольно длинный. В нем 150001 точка. .txt Один из них — необработанный файл от Abaqus. .npy Формат — это то, что я использовал для создания вышеупомянутого графика — (1) вектор времени удален и (2) данные приведены с половинной точностью и нормализованы.

Комментарии:

1. Ваш результат БПФ выглядит почти синусоидальным в частотной области. Обычно это подразумевает какую-то импульсоподобную вещь во временной области. Ваши графики во временной области не показывают этот импульс, но я думаю, что ваши графики во временной области пропускают самый конец формы сигнала. Может быть, там что-то происходит?

Ответ №1:

Любой используемый вами стандартный алгоритм БПФ работает в предположении, что предоставляемый вами сигнал имеет равномерную выборку. Равномерный в этом контексте означает равномерно распределенный по времени. Ваш сигнал явно дискретизирован неравномерно, поэтому БПФ «видит» не идеальный синус, а искаженную версию. Как следствие, вы видите все эти дополнительные спектральные компоненты, которые БПФ вычисляет для отображения вашего искаженного сигнала в частотную область. Теперь у вас есть два варианта. Выполните повторную выборку вашего сигнала, т.Е. он будет равномерно дискретизирован, и используйте готовый БПФ или возьмите неоднородный БПФ, чтобы получить свой спектр. Вот одна библиотека, которую вы могли бы использовать для вычисления вашего неоднородного БПФ.

Комментарии:

1. Я не думаю, что это корень проблемы. Да, должно присутствовать какое-то искажение, но визуально вы можете видеть, что входной сигнал по-прежнему содержит много энергии на ожидаемой частоте. На выходе БПФ должен быть хорошо видимый пик на этой частоте. Я подозреваю, что есть какая-то более фундаментальная проблема, и что ввод и / или вывод БПФ — это не то, что думает операционная система.