【发布时间】:2017-02-06 21:05:36
【问题描述】:
我正在尝试计算提供的交流电压的总谐波失真值。我正在使用 Arduino 以超过 8 KHz 的速率对电压数据进行采样,并将这些数据存储到文本文件中。然后我尝试使用以下用 python 编写的代码 sn-p 计算 thd:
import numpy as np
import scipy.fftpack
from scipy.fftpack import fft
from numpy import genfromtxt
sampled_data = genfromtxt('/../file.txt',delimiter=',')
abs_yf=np.abs(fft(sampled_data))
#As far as I know, THD=sqrt(sum of square magnitude of
#harmonics+noise)/Fundamental value (Is it correct?)So I'm
#just summing up square of all frequency data obtained from FFT,
#sqrt() them and dividing them with fundamental frequecy value.
def thd(abs_data):
sq_sum=0.0
for r in range(len(abs_data)):
sq_sum=sq_sum+(abs_data[r])**2
sq_harmonics=sq_sum-(max(abs_data))**2.0
thd=100*sq_harmonics**0.5/max(abs_data)
return thd
print "Total Harmonic Distortion(in percent):"
print thd(abs_yf)
问题是,在我的情况下,获得的 Thd 值在 5% 到 25% 之间变化。 (实际上它实际上不超过 5%)。我究竟做错了什么?还有其他方法可以找出 thd 吗?
【问题讨论】:
-
请检查代码的缩进
-
THD 只是谐波的总和,而不是 fft 中的每个 bin,除非您的基本周期正好等于数据记录长度。如果您的基频周期不是样本长度的精确整数除数,那么您应该使用 Window 函数和包含许多基频周期的记录长度
-
实际上我正在尝试计算 THD+N。根据 wiki,(en.wikipedia.org/wiki/Total_harmonic_distortion) 它也包括噪声(谐波以外的频率)。
-
您仍然需要加窗或精确整数倍周期,否则您的“噪音”实际上是光谱拖尾。 ADC 数据也可能被“杂散”污染——来自 ADC、传感器硬件的非谐波音调或电源线频率等外来音调。你真的应该绘制 fft 震级数据并关注它
标签: python numpy arduino fft sampling