如何从Pandas数据帧绘制PSD图?

2024-03-29 09:54:57 发布

您现在位置:Python中文网/ 问答频道 /正文

Here you can download the signal and python file

我正试着做一个psd图:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.read_csv('signal.csv')
fft = pd.DataFrame(np.abs(np.fft.rfft(df['1'])))   #y
n = df['0'].size
unit_freq = 1000000000 #Giga
sample_rate = 10000000000   #10 GS/s
freq_sample_fact = sample_rate/unit_freq
freq = np.fft.rfftfreq(n, 1/freq_sample_fact)       #x
fft.index = freq
fft.values[0] = 0


arfft = fft.to_numpy().T
plt.psd(arfft, 512, 0.01)


plt.xlabel('Frequenz / GHz')
plt.ylabel('Signalstärke')
plt.title('FFT')
plt.show()

警告:

Warning (from warnings module):
  File "C:\Users\Artur\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\axes\_axes.py", line 7179
    line = self.plot(freqs, 10 * np.log10(pxx), **kwargs)
RuntimeWarning: divide by zero encountered in log10

输出:

enter image description here

有什么办法可以实现吗?你知道吗


Tags: csvsampleimportfftnumpydfsignalmatplotlib
1条回答
网友
1楼 · 发布于 2024-03-29 09:54:57

psd函数执行内部的所有FFT操作。你知道吗

import pandas as pd
import matplotlib.pyplot as p 
import numpy as np

df = pd.read_csv('c:/pddata/stackoverflow_signal.csv')
dt=df.iloc[10,0]   -df.iloc[0,0]
print(f'time delta: {dt*1e5:.3f} us')  # 10 MHz sampling, if time is in seconds
data=df['1']
print(f'length of vector: {len(data)}, time = {(dt*1e2*len(data)):.3f} ms')

p.figure(figsize=(20,8))
p.subplot(211)
p.plot(data)
p.subplot(212)
p.psd(data,  2000,1/0.1);

参见文档中的示例: https://matplotlib.org/3.1.1/gallery/lines_bars_and_markers/psd_demo.html#sphx-glr-gallery-lines-bars-and-markers-psd-demo-py
如果时间矢量以秒为单位,则采样率为10毫秒/秒,最大频率为5兆赫。你知道吗

enter image description here

相关问题 更多 >