С помощью приведенного ниже кода я хочу получить общее представление о том, как разные частоты присутствуют во входном сигнале и какую «силу» они имеют.
Это работает очень хорошо, если частоты синусоидальных волн не имеют десятичных разрядов (например: 5.0
и 20.0
) - см. Первый скриншот ниже: я получаю для обеих частот резкий пик в БПФ, а также высоту а также сама частота эквивалентны входным параметрам в моем коде.
К сожалению, ситуация отличается, если частота имеет десятичные разряды (например: 5.4
для одной частоты) - см. Второй скриншот: теперь 5.4 больше не являются острым пиком на графике БПФ, а также высотой пика отличается от амплитуды 2,0 этой синусоидальной волны.
У меня два вопроса:
Что я могу сделать для изменения number of points
(n
) или других параметров, чтобы они также имели для 5.4
резкий пик с высотой 2,0, как на другом скриншоте.
Как правильно математически рассчитать силу частотного диапазона (например, 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()
Скриншот 1: нижняя частота равна 5.0
![Screenshot 2](https://i.stack.imgur.com/KTElD.png)
Снимок экрана 2: нижняя частота равна 5.4