请编写一个代码,用于对csv文件中第三列的快速傅里叶变换,生成变换后的频谱图并保存为png文件,计算并打印出半次谐波幅值,基波幅值,1.5次谐波幅值,二次谐波幅值,2.5次谐波幅值,三次谐波幅值,四次谐波幅值,五次谐波幅值,六次谐波幅值,采样频率为21.484hz
时间: 2024-05-16 16:15:16 浏览: 139
以下是代码示例:
```python
import csv
import numpy as np
import matplotlib.pyplot as plt
# 读取csv文件
with open('data.csv', 'r') as file:
reader = csv.reader(file)
data = list(reader)
# 提取第三列数据
signal = [float(row[2]) for row in data]
# 对信号进行快速傅里叶变换
fft_result = np.fft.fft(signal)
# 计算频率分辨率和采样频率
N = len(signal)
freq_resolution = 1 / (N * (1/21.484))
sampling_freq = 21.484
# 计算频率范围
freq_range = np.linspace(0, sampling_freq/2, int(N/2))
# 绘制频谱图并保存为png文件
plt.plot(freq_range, 2/N * np.abs(fft_result[:int(N/2)]))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.savefig('spectrum.png')
# 计算各次谐波幅值
fundamental = np.abs(fft_result[1]) * 2 / N
harm_1p5 = np.abs(fft_result[int(1.5*N/sampling_freq)]) * 2 / N
harm_2 = np.abs(fft_result[int(2*N/sampling_freq)]) * 2 / N
harm_2p5 = np.abs(fft_result[int(2.5*N/sampling_freq)]) * 2 / N
harm_3 = np.abs(fft_result[int(3*N/sampling_freq)]) * 2 / N
harm_4 = np.abs(fft_result[int(4*N/sampling_freq)]) * 2 / N
harm_5 = np.abs(fft_result[int(5*N/sampling_freq)]) * 2 / N
harm_6 = np.abs(fft_result[int(6*N/sampling_freq)]) * 2 / N
# 打印各次谐波幅值
print('Fundamental amplitude:', fundamental)
print('1.5th harmonic amplitude:', harm_1p5)
print('2nd harmonic amplitude:', harm_2)
print('2.5th harmonic amplitude:', harm_2p5)
print('3rd harmonic amplitude:', harm_3)
print('4th harmonic amplitude:', harm_4)
print('5th harmonic amplitude:', harm_5)
print('6th harmonic amplitude:', harm_6)
```
在这个示例中,我们首先使用Python的csv模块读取了名为"data.csv"的csv文件,并从中提取了第三列数据。然后,我们使用NumPy的fft函数对该信号进行了快速傅里叶变换,并计算了频率分辨率和采样频率。接着,我们使用Matplotlib库绘制了变换后的频谱图,并将其保存为一个png文件。
最后,我们计算了信号的各次谐波幅值,并将它们打印出来。注意,这些谐波幅值是通过对傅里叶变换结果的绝对值进行归一化得到的。我们使用了NumPy的abs函数计算傅里叶变换结果的绝对值,并将其与N(信号长度)和采样频率进行运算,以得到归一化的幅值。
阅读全文