在 Python 中使用 FFT 对方波函数执行 THD 计算的错误结果

Wrong results performing THD calculation with FFT on square wave function in Python

提问人:256qam 提问时间:9/6/2023 最后编辑:256qam 更新时间:9/6/2023 访问量:35

问:

我构建了一个函数,该函数应首先对生成的函数执行 FFT,然后再对实际数据执行 FFT。然后我想要信号的 THD(总谐波失真)。为了证明系统,我想用方波和其他波形等功能来检查它。我在 FFT 后无法获得正确的结果。我希望我计算的输出阵列上的振幅不正确,或者我的 THD 计算错误。也许失败也可能是第一步的明星。 将来,此代码应处理来自测量卡的真实数据。但首先我想用一个虚拟代码来尝试它。 我预计结果约为 48.3%。但我的结果大约是 43%。

我试图四舍五入我的时基(“时间”数组),因为时间数组没有精确的数字到浮点数。但这无济于事。我还以 .csv 格式打印了 fft 数据,数组中的最大点是正确的,因此结果振幅应该不正确。

samplingFrequency   = 100000
seconds             = 10
samplingInterval       = 1 / samplingFrequency
beginTime           = int(0)
endTime             = int(10); 
signal1Frequency     = 50

Multiplier           = 1000000
arranged_timefactor  = int((endTime/(1/signal1Frequency))*2)

time_unround       = np.linspace(beginTime, endTime, samplingFrequency*seconds, endpoint=False)     #Timebase

time  = np.around(time_unround, decimals=5)     #round timebase

forStart   = int(0)                              #define startpoint and endpoint with a number of samples
forEnd     = int(len(time))                      #from the signalperiod 

for x in range (forStart, forEnd):                                                  
    if signal.square(2 * np.pi * signal1Frequency * (x/Multiplier)) > 0.5:
        Startpoint = x
        break

print("Startpoint",Startpoint)

for y in range (forStart, forEnd):
    if signal.square(2 * np.pi * signal1Frequency * (y/Multiplier)) < -0.5:
        Endpoint = y
        break

print("Endpoint",Endpoint)
test = signal.square(2 * np.pi * signal1Frequency * time)
print("Endpointarr:", test[Endpoint])

time_arranged = time[Startpoint:Endpoint*arranged_timefactor]

amplitude1_arranged = signal.square(2 * np.pi * signal1Frequency * time_arranged)

fourierTransform = fftpack.fft(amplitude1_arranged)/len(amplitude1_arranged)           # Normalize amplitude

fourierTransform = fourierTransform[range(int(len(amplitude1_arranged)/2))] # Exclude sampling frequency

 

tpCount     = len(amplitude1_arranged)

values      = np.arange(int(tpCount/2))

timePeriod  = tpCount/samplingFrequency

frequencies = values/timePeriod

X_mag = np.array(np.abs(fourierTransform))
print (X_mag)

Vrms =  (X_mag[10*signal1Frequency])
Vrms1 = (X_mag[20*signal1Frequency])
Vrms2 = (X_mag[30*signal1Frequency])
Vrms3 = (X_mag[40*signal1Frequency])
Vrms4 = (X_mag[50*signal1Frequency])
Vrms5 = (X_mag[60*signal1Frequency])
Vrms6 = (X_mag[70*signal1Frequency])
Vrms7 = (X_mag[80*signal1Frequency])
Vrms8 = (X_mag[90*signal1Frequency])
Vrms9 = (X_mag[100*signal1Frequency])
Vrms10 = (X_mag[110*signal1Frequency])

THD = (sqrt(Vrms1**2+Vrms2**2+Vrms3**2+Vrms4**2+Vrms5**2+Vrms6**2+Vrms7**2+Vrms8**2+Vrms9**2+Vrms10**2))/Vrms
THDR = (THD/(sqrt(1+(THD**2))))
print ('THD ', THD*100,'%')
print ('THDR ', THDR*100,'%')
PYTHON 载波 测量 频率分析 频谱

评论


答: 暂无答案