def main():
    # Исходные параметры
    voltage_agc_ref = 1.2  # V - AGC - auto gain control
    dVoltage = 0.6  # V - тестовый скачек
    tau = 15.0  # оценочное врем переходный процессов
    window_metro = tau*3  # sec.
    Fs = 30.0  # freq. sampling - Hz ; with oversampling
    num_points = window_metro*Fs  # сколько отсчетов берем
    # Задаем начальное приближение
    # Все времена порядка секунд
    T1 = 2.0
    T2 = 1.0
    dt = 0.0
    max_dtemperature = 3.0
    temperature_ref = 70.0
    zero_point = (T1, T2, dt, max_dtemperature, temperature_ref)
    axis = XAxis(num_points, 1/Fs)  # Общая временная ось

    # Получить измеренные кривые
    print 'Measures processing...'
    if False:
        print "num_points: ", num_points
        count_curves = 6
        curves = get_list_curves(axis=axis, count_curves=count_curves)
        
        # Оцениваем все параметры кривых
        params = get_notes(curves, axis, zero_point)
        
        if False:
            x = axis.get_axis()
            for curve in curves:
                #plot(x, curve,'b')
                pass
            for record in params:    
                #plot(x, wrapper_for_finding_2l_del_full(record, x),'r')
                pass
            #grid(); show()

    # Усредняем
    if False:
        # Предыдущее условие должно быть True
        # Рассчитываем
        mean_params  = mean_list_lists(params)
    else:
        
        # Используем уже полученные результаты
        mean_params = [  5.32255626,   3.07633474,   0.88892465,   2.14692147,  69.83541651]
    print 'Mean params =', mean_params 
    
    # Оценка стойкости к зашумленности исходных данных
    # Рассматривается только аддитивный белый гауссовский шум
    # Как показывают опыты, если шум мал, то все параметры оцениваются
    #   достаточно точно.
    #
    # Не будем использовать - слишком долго считает
    if False:
        count_curves= 100
        sigma = 0.03  # зашумленность сигнала
        curves = []
        for i in range(count_curves):
            noise = gen.get_gauss_noise(sigma, len(axis.get_axis()))
            curve = get_list_art_curves(
                    axis=axis, 
                    noise=noise, 
                    count_curves=count_curves, 
                    base_params=mean_params)
            curves.append(curve[0])
        x = axis.get_axis()
        for curve in curves:
            #plot(x, curve,'b')
            pass
        #show()
        params = get_notes(curves, axis, zero_point)
        T1_set = []
        for record in params:  
            T1_set.append(record[0])  
            pass
        print T1_set
        hist(T1_set, 20)  # Гистограмма
        show()
    
    # Рассчитываем незашумленную кривую
    work_freq = 3.0  # Hz
    T1, T2, dt, max_dtemperature, temperature_ref = mean_params
    params = T1, T2, dt, max_dtemperature/dVoltage, temperature_ref
    if True:
        # Аналоговая часть
        print '\nAnalog...'
        num_points = 1024
        freq_axis = calc_half_fs_axis(num_points, work_freq)
        h, phi, freq_axis, h_db, h_complex = calc_analog_filter_curves(
                params, 
                freq_axis, 
                af_order2_asym_delay)
        cut_position = get_cut_position(h_db)
             
        # Рисуем
        # Запас по фазе должен быть больше -180 (-120...)
        rest_phase, rest_ampl = get_stability_notes(h_complex)
        print 'Phase rest =', rest_phase
        print 'Phase magnitude =', 1/rest_ampl
        plot_normalize_analog(h, phi, freq_axis, work_freq, cut_position)
        #show()

    if True:
        # Цифровая часть
        print '\nDigital...'
        b, a, fs = calc_digital_characteristics(params[:-1], work_freq)
        
        # Моделирование сдвига сигнала во времени
        # Точность моделирования задержки - такт. Округляем в большую сторону
        delay = zeros(work_freq*dt+2)
        delay[-1] = 1
        b = (P(b)*P(delay)).coef
        
        print 'b =',b 
        print 'a =', a
        h, w = get_dfilter_axises(b, a)
        
        rest_phase, rest_ampl = get_stability_notes(h)
        print 'Phase rest =', rest_phase
        print 'Phase magnitude =', 1/rest_ampl
        
        
        """ View """
        #impz(b, a)
        mfreqz(h, w)
        show()
        
        if False:
            # Оценка точности
            pass
        
        if True:
            # Оценка устойчивости
            pass
        
        # Решение проблем, связанных с переходом 
        #   от дискретной системы к цифровой
        if False:
            # Исследование комбинации фильтра, сглаживающего
            #   сигнал ошибки и усилителя
            pass
# App
from visualisers import mfreqz
from visualisers import impz
from iir_models.iir_digital import calc_digital_characteristics
   

if __name__=='__main__':
    mean_params = (5.32255626,   3.07633474,   0.88892465,   2.14692147,  69.83541651)
    (T1, T2, t0, K, dy) = mean_params
    #K = 1
    freq = arange(10000)*0.01 # Hz 
    freq_sampling = 1  # Hz
    
    """ Model """
    b, a, fs = calc_digital_characteristics((T1, T2, t0, K), freq_sampling)
    print b, a
    #b = ones(1)
    from numpy.polynomial import Polynomial as P
    a1 = P(b)
    a2 = P([0,0,0,1])
    b = (a1*a2).coef
    
    """ View """
    #plot_normalize_analog(tau, freq, freq_sampling, plot_AFC, plot_PFC)
    #impz(b, a)
    mfreqz(b, a)
    
    b, a, fs = calc_digital_characteristics((T1, T2, t0, K), freq_sampling)
    print b, a