БПФ с частотами с десятичными разрядами - как количественно определить, что частоты одинаково взвешены? - PullRequest
2 голосов
/ 03 апреля 2019

С помощью приведенного ниже кода я хочу получить общее представление о том, как разные частоты присутствуют во входном сигнале и какую «силу» они имеют.

Это работает очень хорошо, если частоты синусоидальных волн не имеют десятичных разрядов (например: 5.0 и 20.0) - см. Первый скриншот ниже: я получаю для обеих частот резкий пик в БПФ, а также высоту а также сама частота эквивалентны входным параметрам в моем коде.

К сожалению, ситуация отличается, если частота имеет десятичные разряды (например: 5.4 для одной частоты) - см. Второй скриншот: теперь 5.4 больше не являются острым пиком на графике БПФ, а также высотой пика отличается от амплитуды 2,0 этой синусоидальной волны.

У меня два вопроса:

  1. Что я могу сделать для изменения number of points (n) или других параметров, чтобы они также имели для 5.4 резкий пик с высотой 2,0, как на другом скриншоте.

  2. Как правильно математически рассчитать силу частотного диапазона (например, 0 5.4 оба диапазона должны давать одинаковые frequency strength.

код:

import matplotlib
matplotlib.use('QT5Agg')
import matplotlib.pyplot as plt
import numpy as np
from numpy.fft import fft, fftfreq

# setup for domain - number of points
n = 1000.

# distance (in meters) or time period (in seconds)
Lx = 100.

omega = 2.0 * np.pi / Lx
x = np.linspace(0, Lx, n)

y1 = 2.0 * np.sin(5.4 * omega * x)
y2 = 2.0 * np.sin(25.0 * omega * x)

y = y1 + y2

freqs = fftfreq(int(n))

mask = freqs >= 0

nwaves = freqs * n

fft_vals = fft(y)

# true theoretical fft
fft_theo = 2.0 * np.abs(fft_vals / n)  # multiplied by 2 because I do not look at negative frequencies and have to take their values into account here, too.

plt.figure(8)
plt.plot(nwaves[mask], fft_theo[mask], "-o", markersize=4, label='fft')
plt.xlim(-0.1, 30)
plt.minorticks_on()
plt.grid(b=True, which='major', color='b', linestyle='--')
plt.grid(b=True, which='minor', color='y', linestyle='--')
plt.show()

Screenshot 1

Скриншот 1: нижняя частота равна 5.0

Screenshot 2

Снимок экрана 2: нижняя частота равна 5.4

1 Ответ

2 голосов
/ 03 апреля 2019

В обоих случаях вы можете использовать интерполяцию (или реконструкцию) Синка, чтобы увидеть реальный спектр оконной синусоиды между строго целочисленными периодическими частотами в апертуре.

Нет резкого пика для сигнала любой конечной длины. Это выглядит только потому, что вы строите только целочисленные периодические точки частоты.

...