Ejemplo n.º 1
0
    def test_THD_lin(self):
        far = adsp.Farina(20, _fs_)
        meas = self.lin_sys(far.probe)
        far.process_measurement(meas)

        thd = far.getTHD()
        self.assertTrue(thd < 0.1, 'Incorrect THD for linear system!')
Ejemplo n.º 2
0
    def test_inverse_probe_imp(self):
        far = adsp.Farina(10, _fs_)
        delta = signal.convolve(far.probe, far.inv_probe)
        delta_sort = np.sort(np.abs(delta))
        ratio = delta_sort[-1] / delta_sort[-2]

        self.assertTrue(
            ratio > 5, 'Probe and inverse probe does not convolve to a delta!')
Ejemplo n.º 3
0
    def test_inverse_probe_freq(self):
        far = adsp.Farina(10, _fs_)
        delta = signal.convolve(far.probe, far.inv_probe)

        freqs = np.fft.rfftfreq(len(delta), 1.0 / _fs_)
        start = np.argwhere(freqs > 100)[0][0]
        end = np.argwhere(freqs < 16000)[-1][0]

        delta_fft = 20 * \
            np.log10(adsp.normalize(np.abs(np.fft.rfft(delta))))[start:end]
        rangeDB = np.max(delta_fft) - np.min(delta_fft)
        self.assertTrue(
            rangeDB < 2.0,
            'Inverse probe does not have correct frequency response!')
Ejemplo n.º 4
0
    def test_freq_response_nonlin(self):
        far = adsp.Farina(20, _fs_)
        meas = self.nonlin_sys(far.probe)
        far.process_measurement(meas)

        freqs = np.fft.rfftfreq(self.N, 1.0 / _fs_)
        start = np.argwhere(freqs > 100)[0][0]
        end = np.argwhere(freqs < 16000)[-1][0]

        test_fft = 20 * \
            np.log10(adsp.normalize(np.abs(np.fft.rfft(self.test_filt))))[
                start:end]
        far_fft = 20 * \
            np.log10(adsp.normalize(np.abs(np.fft.rfft(far.get_IR()[:self.N]))))[
                start:end]
        error = np.max(np.abs(test_fft - far_fft))

        self.assertTrue(error < 10,
                        'Incorrect frequency response for nonlinear system!')
Ejemplo n.º 5
0
    def test_THD_nonlin(self):
        # get reference THD from sine wave test
        N = _fs_ * 2
        freq = 1000
        sine = np.sin(2 * np.pi * np.arange(N) * freq / _fs_)
        y = self.nonlin_sys(sine)

        V_rms = np.zeros(9)
        for n in range(1, 10):
            low_freq = freq * n - 30
            b_hpf, a_hpf = signal.butter(4,
                                         low_freq,
                                         btype='highpass',
                                         analog=False,
                                         fs=_fs_)

            high_freq = freq * n + 30
            b_lpf, a_lpf = signal.butter(4,
                                         high_freq,
                                         btype='lowpass',
                                         analog=False,
                                         fs=_fs_)

            harmonic = signal.lfilter(b_hpf, a_hpf,
                                      (signal.lfilter(b_lpf, a_lpf, y)))
            V_rms[n - 1] = np.sqrt(np.mean(harmonic**2))

        sine_thd = np.sqrt(np.sum(V_rms[1:]**2)) / V_rms[0]

        # get measured THD from Farina
        far = adsp.Farina(20, _fs_)
        meas = self.nonlin_sys(far.probe)
        far.process_measurement(meas)
        far_thd = far.getTHD()

        error = np.abs(far_thd - sine_thd)
        self.assertTrue(error < 0.1,
                        f'Incorrect THD! Sine: {sine_thd}, Far: {far_thd}')