Почему я не могу получить фазовый спектр БПФ с помощью своего кода?

#python #numpy #fft #phase

Вопрос:

Я пытался провести анализ Фурье для некоторого дискретного набора значений, соответствующих более или менее синусоидальным функциям. Частотный спектр дает отличные значения, но когда я пытаюсь использовать частотно-фазовый спектр, все идет не так: точки в спектре разбросаны повсюду и не имеют никакого физического или математического смысла. Кто-нибудь может сказать мне, что не так с моим кодом? Я пробовал использовать реализацию расчета фазы с помощью двух методов (один просто меньше, как комментарий).

 import numpy as np
import matplotlib.pyplot as plt
import math

LX=64
LY=32
font = '12'
font2 = '14'
lwd = 0.5


arr=np.loadtxt("output/obstPos.dat",delimiter=' ')
t = arr[:,0]
x = arr[:,1]
plt.plot(t, x, linestyle="-", color = "r", linewidth=lwd)
x_detrended = signal.detrend(x)     #removes any linear trend (0 Hz)


plt.xlabel(r"$rm t$", fontsize=font2)
plt.ylabel(r'$rm x


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

1. не могли бы вы предоставить некоторые примеры данных, которые показывают проблему?

2. должен ли я предоставить файл, подобный "obstPos.dat", который я использую для набора данных, или графики, которые выводит код?

3. содержимое вашего файла данных, если вы можете поделиться им. Если не макет набора данных, который показывает ту же проблему. В принципе достаточно, чтобы воспроизвести вашу проблему в полном объеме - без набора данных кому-то может быть сложно разобраться в вашей проблеме

4. Я загрузил один из файлов .dat, который пытаюсь проанализировать, в filebin.net/e8vesvmt5b1salhy . данные представляют собой простую функцию cos с фазой, близкой к pi/2 (так как начальное значение близко к среднему значению сигнала). таким образом, ожидалось, что частотно-фазовый график будет иметь только 2 симметричных пика на частоте сигнала и соответствует близкому /- pi/2.

, fontsize=font2)
plt.yticks(fontsize=font)
plt.xticks(fontsize=font)
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0), useMathText=True)
plt.savefig('output/pos-time.png', dpi=600, bbox_inches='tight')
plt.clf()

#frequency measurement (Fourier)

time_step = 500 #step between the points
n = x.size
sp = np.fft.fft(x_detrended)
freq = np.fft.fftfreq(n, d=time_step)

#plot frequency spectrum
plt.plot(freq, np.abs(sp), '.', color='blue')

plt.ylabel(r"$rm vert N_{x}vert$", fontsize=font2)
plt.xlabel(r'$rm freq

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

1. не могли бы вы предоставить некоторые примеры данных, которые показывают проблему?

2. должен ли я предоставить файл, подобный "obstPos.dat", который я использую для набора данных, или графики, которые выводит код?

3. содержимое вашего файла данных, если вы можете поделиться им. Если не макет набора данных, который показывает ту же проблему. В принципе достаточно, чтобы воспроизвести вашу проблему в полном объеме - без набора данных кому-то может быть сложно разобраться в вашей проблеме

4. Я загрузил один из файлов .dat, который пытаюсь проанализировать, в filebin.net/e8vesvmt5b1salhy . данные представляют собой простую функцию cos с фазой, близкой к pi/2 (так как начальное значение близко к среднему значению сигнала). таким образом, ожидалось, что частотно-фазовый график будет иметь только 2 симметричных пика на частоте сигнала и соответствует близкому /- pi/2.

, fontsize=font2)
plt.yticks(fontsize=font)
plt.xticks(fontsize=font)
plt.rcParams['font.size']=font
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0), useMathText=True)
plt.xlim(-0.0005, 0.0005)
plt.ylim(0, 6000)
plt.savefig('output/frequencies.png', dpi=200, bbox_inches='tight')
plt.clf()

#plot frequency-phase spectrum
#phase = np.angle(sp)
SP = sp
tau = max(abs(sp))/10000
SP[abs(sp) < tau] = 0
phase=np.arctan2(np.imag(SP),np.real(SP))
plt.plot(freq, phase, '.', color='blue')

plt.ylabel(r"$rm phase$", fontsize=font2)
plt.xlabel(r'$rm freq

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

1. не могли бы вы предоставить некоторые примеры данных, которые показывают проблему?

2. должен ли я предоставить файл, подобный "obstPos.dat", который я использую для набора данных, или графики, которые выводит код?

3. содержимое вашего файла данных, если вы можете поделиться им. Если не макет набора данных, который показывает ту же проблему. В принципе достаточно, чтобы воспроизвести вашу проблему в полном объеме - без набора данных кому-то может быть сложно разобраться в вашей проблеме

4. Я загрузил один из файлов .dat, который пытаюсь проанализировать, в filebin.net/e8vesvmt5b1salhy . данные представляют собой простую функцию cos с фазой, близкой к pi/2 (так как начальное значение близко к среднему значению сигнала). таким образом, ожидалось, что частотно-фазовый график будет иметь только 2 симметричных пика на частоте сигнала и соответствует близкому /- pi/2.

, fontsize=font2)
plt.yticks(fontsize=font)
plt.xticks(fontsize=font)
plt.rcParams['font.size']=font
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0), useMathText=True)
plt.xlim(-0.0005, 0.0005)
plt.ylim(-3.2, 3.2)
plt.savefig('output/phases.png', dpi=200, bbox_inches='tight')
plt.clf()

#select the interval which is the peak
index = np.where(sp == np.amax(sp[1:n]))[0][0]
freqMax = np.abs(freq[index])
print("The oscillation frequency is: %.8f"%freqMax)
phaseMax = phase[index]
print("The oscillation phase is: %.8f"%phaseMax)```

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

1. не могли бы вы предоставить некоторые примеры данных, которые показывают проблему?

2. должен ли я предоставить файл, подобный «obstPos.dat», который я использую для набора данных, или графики, которые выводит код?

3. содержимое вашего файла данных, если вы можете поделиться им. Если не макет набора данных, который показывает ту же проблему. В принципе достаточно, чтобы воспроизвести вашу проблему в полном объеме — без набора данных кому-то может быть сложно разобраться в вашей проблеме

4. Я загрузил один из файлов .dat, который пытаюсь проанализировать, в filebin.net/e8vesvmt5b1salhy . данные представляют собой простую функцию cos с фазой, близкой к pi/2 (так как начальное значение близко к среднему значению сигнала). таким образом, ожидалось, что частотно-фазовый график будет иметь только 2 симметричных пика на частоте сигнала и соответствует близкому /- pi/2.