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
输出:
有办法实现这一点吗?
最佳答案
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 MSa/sec,最大采样率为 10 MSa/sec。频率 5 MHz。
关于python - 如何从 pandas 数据帧制作 PSD 图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58325722/