2017-02-06 2 views
2

Я пытаюсь рассчитать общие значения гармонических искажений переменного напряжения. Я беру данные об измерении напряжения, используя Arduino со скоростью более 8 кГц и сохраняя эти данные в текстовом файле. Тогда я пытаюсь вычислить THD, используя следующий фрагмент кода, написанный на питоне:Вычисление th в python

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% на самом деле). Что я делаю не так? Есть ли другой способ узнать это?

+1

Проверьте отступ вашего кода, пожалуйста – Dmitry

+4

THD - это только сумма гармоник, а не каждый бит в fft, если только ваш фундаментальный период не равен длине записи данных. Если ваш основной период частоты не является точным делителем длины выборки, тогда вы должны использовать функцию окна и длину записи, которая содержит много периодов фундаментального значения. – f5r5e5d

+0

На самом деле я пытаюсь вычислить THD + N. Согласно wiki, (https://en.wikipedia.org/wiki/Total_harmonic_distortion) он включает в себя шумы (частоты, отличные от гармоник). – tahsin314

ответ

0

Вполне вероятно, что вы добавите дополнительные искажения самим процессом измерения.

Если вы сравните АЦП Arduino с устройством измерения высокого класса, значения Arduino, скорее всего, будут намного хуже. По крайней мере, вам нужны очень стабильные часы без дрожания.

Кроме того, вывод данных (я думаю, через UART) может повлиять на время измерения АЦП.

+0

Спасибо, но я сделал тот же анализ, используя те же данные в MATLAB. В этом случае он показывает результаты около 2%, что хорошо, я думаю. Вы можете найти код [здесь] (http://pastebin.com/T7ib0N27) Возможно, это не совсем ошибка Ардуино. (Я не очень разбираюсь в аппаратных средствах микроконтроллера, поэтому исправьте меня, если я ошибаюсь). Мне нужно работать с python в этом случае. Так что же я могу сделать? – tahsin314

+0

Хорошо, тогда мое предположение было неправильным, что вы использовали дополнительное оборудование. Во всяком случае, не делайте слишком тяжелые результаты, но я не знаю вашего заявления - этого может быть достаточно. Но f5r5e5d имеет очень веский аргумент. Вы должны это расследовать! – koalo

Смежные вопросы