【发布时间】:2020-03-20 09:04:20
【问题描述】:
我的工作是使用 FFT 绘制频率与信号的关系图。这是我迄今为止编写的代码:
def Extract_Data(filepath, pattern):
data = []
with open(filepath) as file:
for line in file:
m = re.match(pattern, line)
if m:
data.append(list(map(float, m.groups())))
#print(data)
data = np.asarray(data)
#Convert lists to arrays
variable_array = data[:,1]
time_array = data[:,0]
return variable_array, time_array
def analysis_FFT(filepath, pattern):
signal, time = Extract_Data(filepath, pattern)
signal_FFT = np.fft.fft(signal)
N = len(signal_FFT)
T = time[-1]
#Frequencies
signal_freq = np.fft.fftfreq(N, d = T/N)
#Shift the frequencies
signal_freq_shift = np.fft.fftshift(signal_freq)
#Real and imagniary part of the signal
signal_real = signal_FFT.real
signal_imag = signal_FFT.imag
signal_abs = pow(signal_real, 2) + pow(signal_imag, 2)
#Shift the signal
signal_shift = np.fft.fftshift(signal_FFT)
#signal_shift = np.fft.fftshift(signal_FFT)
#Spectrum
signal_spectrum = np.abs(signal_shift)
我真正关心的是采样率。当您查看该图时,看起来前 ~0.002 秒的采样率与信号的其余部分不同。所以我在想也许我需要对信号进行归一化
但是,当我使用np.fft.fftfreq(N, d =T/N) 时,np.fft.ffreq 似乎假设信号在整个域中具有相同的采样率。所以我不确定如何使用np.fft 标准化信号。有什么建议吗?
干杯。
【问题讨论】:
-
我认为问题是绘制频率与
time,即频谱图。 Scipy有这样一个功能,scipy.signal.spectrogram。根据您提供的内容,无法看到采样率,并且实验数据通常不会改变采样率。您的信号最初具有较高的物理频率。因此,首先,绘制信号采样率以确保您拥有什么(从 1 到时间结束的所有 i 的 time[i+1]- time[i])。
标签: python-3.x signal-processing fft normalization frequency-analysis