Python 3.x 归一化-具有不同采样率的信号
我试图解决一个信号处理问题。我有这样的信号 我的工作是使用FFT绘制频率与信号的关系。这是我到目前为止编写的代码:Python 3.x 归一化-具有不同采样率的信号,python-3.x,signal-processing,fft,normalization,frequency-analysis,Python 3.x,Signal Processing,Fft,Normalization,Frequency Analysis,我试图解决一个信号处理问题。我有这样的信号 我的工作是使用FFT绘制频率与信号的关系。这是我到目前为止编写的代码: def Extract_Data(filepath, pattern): data = [] with open(filepath) as file: for line in file: m = re.match(pattern, line) if m: data.
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.002s的采样率似乎与信号的其余部分不同。所以我想也许我需要使信号正常化
然而,当我使用np.fft.fftfreq(N,d=T/N)
时,似乎np.fft.ffreq
假设信号在整个域中具有相同的采样率。因此,我不确定如何使用np.fft
对信号进行规范化。有什么建议吗
干杯
这就是我用移位信号绘制移位频率[Hz]时得到的结果
我生成了一个与你类似的合成信号,并绘制了它,就像你在整个时间内绘制的光谱一样。你的图很好,因为它涉及整个光谱,只是似乎没有给出绝对值
import numpy as np
import matplotlib.pyplot as p
%matplotlib inline
T=0.05 # 1/20 sec
n=5000 # 5000 Sa, so 100kSa/sec sampling frequency
sf=n/T
d=T/n
t=np.linspace(0,T,n)
fr=260 # Hz
y1= - np.cos(2*np.pi*fr*t) * np.exp(- 20* t)
y2= 3*np.sin(2*np.pi*10*fr*t+0.5) *np.exp(-2e6*(t-0.001)**2)
y=(y1+y2)/30
f=np.fft.fftshift(np.fft.fft(y))
freq=np.fft.fftshift(np.fft.fftfreq(n,d))
p.figure(figsize=(12,8))
p.subplot(311)
p.plot(t,y ,color='green', lw=1 )
p.xlabel('time (sec)')
p.ylabel('Velocity (m/s)')
p.subplot(312)
p.plot(freq,np.abs(f)/n)
p.xlabel('freq (Hz)')
p.ylabel('Velocity (m/s)');
p.subplot(313)
s=slice(n//2-500,n//2+500,1)
p.plot(freq[s],np.abs(f)[s]/n)
p.xlabel('freq (Hz)')
p.ylabel('Velocity (m/s)');
在底部,我放大了一点以显示两个主要的频率分量。请注意,我们显示的是正频率和负频率(只有正频率,乘以2x是物理频率)。2600 Hz处的高斯表示脉冲群的频谱(高斯英尺为高斯)。260 Hz的直线表示缓慢的基频(正弦英尺为三角形)
然而,这隐藏了两个独立频率分量的定时,即开始时约2.6 kHz的短(在我的情况下为高斯)突发和约260 Hz的衰减低音。频谱图将信号的短片段(nperseg)的光谱绘制为垂直条纹,其中颜色表示强度。您可以在时间帧之间设置一些重叠,这应该是段长度的一部分。通过将这些条纹随时间叠加,可以得到光谱随时间变化的曲线图
from scipy.signal import spectrogram
f, t, Sxx = spectrogram(y,sf,nperseg=256,noverlap=64)
p.pcolormesh(t, f[:20], Sxx[:20,:])
#p.pcolormesh(t, f, Sxx)
p.ylabel('Frequency [Hz]')
p.xlabel('Time [sec]')
p.show()
在FFT的帮助下,尝试自己生成频谱图是很有意义的。否则,最初频谱图功能的设置可能不是很直观 我假设问题是绘制频率与时间的关系,即频谱图。Scipy有这样一个功能,
Scipy.signal.spectrogram
。根据您给出的数据,不可能看到采样率,而且实验数据中采样率的变化也不典型。您的信号最初具有较高的物理频率。因此,首先,绘制信号采样率,以确保您拥有什么(时间[i+1]-从1到时间结束的所有i的时间[i])。