Я пытаюсь определить общую энергию, зарегистрированную детектором во временной области, с помощью его спектра. Первым шагом после выполнения быстрого преобразования Фурье с библиотекой БПФ Numpy было подтверждение теоремы Парсеваля.
Согласно теореме, полная энергия во временной области и в частотной области должна быть одинаковой. У меня есть две проблемы, которые я не могу решить.
- Я могу подтвердить теорему, если не использую правильные единицы измерения для оси X во время интеграции np.trapz(). Как только я использую свои фактические точки/частоты выборки, результат отключается. Я не понимаю, почему это так, и мне интересно, могу ли я применить нормализацию для устранения этой ошибки.
- Я не могу подтвердить теорему, когда применяю смещение постоянного тока к сигналу (раскомментируйте строку f = np.sin(np.pi**t)*).
Ниже мой код с примером функции синуса.
# Python code
import matplotlib.pyplot as plt
import numpy as np
# Create a Sine function
dt = 0.001 # Time steps
t = np.arange(0,10,dt) # Time array
f = np.sin(np.pi*t) # Sine function
# f = np.sin(np.pi*t)+1 # Sine function with DC offset
N = len(t) # Number of samples
# Energy of function in time domain
energy_t = np.trapz(abs(f)**2)
# Energy of function in frequency domain
FFT = np.sqrt(2) * np.fft.rfft(f) # only positive frequencies; correct magnitude due to discarding of negative frequencies
FFT[0] /= np.sqrt(2) # DC magnitude does not have to be corrected
FFT[-1] /= np.sqrt(2) # Nyquist frequency does not have to be corrected
frq = np.fft.rfftfreq(N,d=dt) # FFT frequenices
# Energy of function in frequency domain
energy_f = np.trapz(abs(FFT)**2) / N
print('Parsevals theorem fulfilled: ' + str(energy_t - energy_f))
# Parsevals theorem with proper sample points
energy_t = np.trapz(abs(f)**2, x=t)
energy_f = np.trapz(abs(FFT)**2, x=frq) / N
print('Parsevals theorem NOT fulfilled: ' + str(energy_t - energy_f))
trapz
придает только половину веса первому и последнему образцам. Используйтеsum
или добавьте первый образец в конец, так как ожидается, что и частоты, и сигнал будут циклическими.Оба метода сработали, спасибо!