请编写一个代码,用于对csv文件中第三列的快速傅里叶变换,生成变换后的频谱图并保存为png文件,计算并打印出半次谐波幅值,基波幅值,1.5次谐波幅值,二次谐波幅值,2.5次谐波幅值,三次谐波幅值,四次谐波幅值,五次谐波幅值,六次谐波幅值,采样频率为21.484hz
时间: 2024-05-16 12:15:15 浏览: 88
以下是Python代码实现:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读取csv文件
data = pd.read_csv('your_csv_file.csv')
# 取第三列数据
signal = data.iloc[:, 2]
# 计算快速傅里叶变换
fft = np.fft.fft(signal)
# 计算频率数组
freq = np.fft.fftfreq(len(signal), d=1/21.484)
# 绘制频谱图并保存为png文件
plt.plot(freq, np.abs(fft))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.savefig('your_output_file.png')
# 计算各次谐波幅值
f0 = 1/21.484 # 基频频率
n = len(signal) // 2
amp_f0 = 2/n * np.abs(fft[0])
amp_half = 2/n * np.abs(fft[int(n/2)])
amp_1_5 = 2/n * np.abs(fft[int(n*1.5*f0)])
amp_2 = 2/n * np.abs(fft[int(2*f0)])
amp_2_5 = 2/n * np.abs(fft[int(n*2.5*f0)])
amp_3 = 2/n * np.abs(fft[int(3*f0)])
amp_4 = 2/n * np.abs(fft[int(4*f0)])
amp_5 = 2/n * np.abs(fft[int(5*f0)])
amp_6 = 2/n * np.abs(fft[int(6*f0)])
# 打印各次谐波幅值
print('Half harmonic amplitude: ', amp_half)
print('Fundamental frequency amplitude: ', amp_f0)
print('1.5 harmonic amplitude: ', amp_1_5)
print('2 harmonic amplitude: ', amp_2)
print('2.5 harmonic amplitude: ', amp_2_5)
print('3 harmonic amplitude: ', amp_3)
print('4 harmonic amplitude: ', amp_4)
print('5 harmonic amplitude: ', amp_5)
print('6 harmonic amplitude: ', amp_6)
```
其中,`your_csv_file.csv`为输入的csv文件名,`your_output_file.png`为输出的频谱图文件名。在计算各次谐波幅值时,我们使用了FFT的性质:对于长度为N的信号,FFT计算后的前N/2个值是正频率部分,后N/2个值是负频率部分,其中第0个值是直流分量,第N/2个值是Nyquist频率。因此,我们可以通过索引得到各次谐波的幅值。
阅读全文