#!/usr/bin/python2 # Copyright (C) 2016 Sixten Bergman # License WTFPL # # This program is free software. It comes without any warranty, to the extent # permitted by applicable law. # You can redistribute it and/or modify it under the terms of the Do What The # Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See # http://www.wtfpl.net/ for more details. # import numpy as np from math import pi, sqrt __all__ = [ 'ACV_A1', 'ACV_A2', 'ACV_A3', 'ACV_A4', 'ACV_A5', 'ACV_A6', 'ACV_A7', 'ACV_A8' ] #Heavyside step function H_num = lambda t: 1 if t > 0 else 0 H = lambda T: np.asarray([1 if t > 0 else 0 for t in T]) # pure sine def ACV_A1(T, Hz=50): """ Generate a pure sine wave at a specified frequency keyword arguments: T -- time points to generate the waveform given in seconds Hz -- The desired frequency of the signal (default:50) """ ampl = 1000 T = np.asarray(T, dtype=np.float64) return ampl * sqrt(2) * np.sin(2*pi*Hz * T) def ACV_A2(T, Hz=50): """ Generate a pure sine wave with a DC offset at a specified frequency keyword arguments: T -- time points to generate the waveform given in seconds Hz -- The desired frequency of the signal (default:50) """ ampl = 1000 offset = 500 T = np.asarray(T, dtype=np.float64) return ampl * sqrt(2) * np.sin(2*pi*Hz * T) + offset def ACV_A3(T, Hz=50): """ Generate a fundamental with a 3rd overtone keyword arguments: T -- time points to generate the waveform given in seconds Hz -- The desired frequency of the signal (default:50) """ ampl = 1000 T = np.asarray(T, dtype=np.float64) main_wave = np.sin(2*pi*Hz * T) harmonic_wave = 0.05 * np.sin(2*pi*Hz * T * 4 + pi * 2 / 3) return ampl * sqrt(2) * (main_wave + harmonic_wave) def ACV_A4(T, Hz=50): """ Generate a fundamental with a 4th overtone keyword arguments: T -- time points to generate the waveform given in seconds Hz -- The desired frequency of the signal (default:50) """ ampl = 1000 T = np.asarray(T, dtype=np.float64) main_wave = np.sin(2*pi*Hz * T) harmonic_wave = 0.07 * np.sin(2*pi*Hz * T * 5 + pi * 22 / 18) return ampl * sqrt(2) * (main_wave + harmonic_wave) def ACV_A5(T, Hz=50): """ Generate a realistic triangle wave keyword arguments: T -- time points to generate the waveform given in seconds Hz -- The desired frequency of the signal (default:50) """ ampl = 1000 T = np.asarray(T, dtype=np.float64) wave_1 = np.sin(2*pi*Hz * T) wave_2 = 0.05 * np.sin(2*pi*Hz * T * 3 - pi) wave_3 = 0.05 * np.sin(2*pi*Hz * T * 5) wave_4 = 0.02 * np.sin(2*pi*Hz * T * 7 - pi) wave_5 = 0.01 * np.sin(2*pi*Hz * T * 9) return ampl * sqrt(2) * (wave_1 + wave_2 + wave_3 + wave_4 + wave_5) def ACV_A6(T, Hz=50): """ Generate a realistic triangle wave keyword arguments: T -- time points to generate the waveform given in seconds Hz -- The desired frequency of the signal (default:50) """ ampl = 1000 T = np.asarray(T, dtype=np.float64) wave_1 = np.sin(2*pi*Hz * T) wave_2 = 0.02 * np.sin(2*pi*Hz * T * 3 - pi) wave_3 = 0.02 * np.sin(2*pi*Hz * T * 5) wave_4 = 0.0015 * np.sin(2*pi*Hz * T * 7 - pi) wave_5 = 0.009 * np.sin(2*pi*Hz * T * 9) return ampl * sqrt(2) * (wave_1 + wave_2 + wave_3 + wave_4 + wave_5) def ACV_A7(T, Hz=50): """ Generate a growing sine wave, where the wave starts at 0 and reaches 0.9 of full amplitude at 250 cycles. Thereafter it will linearly increase to full amplitude at 500 cycles and terminate to 0 Frequency locked to 50Hz and = 0 at t>10 keyword arguments: T -- time points to generate the waveform given in seconds Hz -- The desired frequency of the signal (default:50) """ ampl = 1000 Hz = 50 T = np.asarray(T, dtype=np.float64) wave_main = np.sin(2*pi*Hz * T) step_func = (0.9 * T / 5 * H(5-T) + H(T-5) * H(10-T) * (0.9 + 0.1 * (T-5) / 5)) return ampl * sqrt(2) * wave_main * step_func def ACV_A8(T, Hz=50): """ Generate a growing sine wave, which reaches 100 times the amplitude at 500 cycles frequency not implemented and signal = 0 at t>1000*pi signal frequency = 0.15915494309189535 Hz? keyword arguments: T -- time points to generate the waveform given in seconds Hz -- The desired frequency of the signal (default:50) """ ampl = 1000 Hz = 50 T = np.asarray(T, dtype=np.float64) wave_main = np.sin(T) step_func = T / (10 * pi) * H(10 - T / (2*pi*Hz)) return ampl * sqrt(2) * wave_main * step_func _ACV_A1_L = lambda T, Hz = 50: 1000 * sqrt(2) * np.sin(2*pi*Hz * T) # _ACV_A2_L = lambda T, Hz = 50: 1000 * sqrt(2) * np.sin(2*pi*Hz * T) + 500 # _ACV_A3_L = lambda T, Hz = 50: 1000 * sqrt(2) * (np.sin(2*pi*Hz * T) + 0.05 * np.sin(2*pi*Hz * T * 4 + pi * 2 / 3)) # _ACV_A4_L = lambda T, Hz = 50:( 1000 * sqrt(2) * (np.sin(2*pi*Hz * T) + 0.07 * np.sin(2*pi*Hz * T * 5 + pi * 22 / 18))) # Realistic triangle _ACV_A5_L = lambda T, Hz = 50:( 1000 * sqrt(2) * (np.sin(2*pi*Hz * T) + 0.05 * np.sin(2*pi*Hz * T * 3 - pi) + 0.05 * np.sin(2*pi*Hz * T * 5) + 0.02 * np.sin(2*pi*Hz * T * 7 - pi) + 0.01 * np.sin(2*pi*Hz * T * 9))) # _ACV_A6_L = lambda T, Hz = 50:( 1000 * sqrt(2) * (np.sin(2*pi*Hz * T) + 0.02 * np.sin(2*pi*Hz * T * 3 - pi) + 0.02 * np.sin(2*pi*Hz * T * 5) + 0.0015 * np.sin(2*pi*Hz * T * 7 - pi) + 0.009 * np.sin(2*pi*Hz * T * 9))) #A7 & A8 convert so that a input of 16*pi corresponds to a input 0.25 in the current version _ACV_A7_OLD = lambda T: [1000 * sqrt(2) * np.sin(100 * pi * t) * (0.9 * t / 5 * H_num(5-t) + H_num(t-5) * H_num(10-t) * (0.9 + 0.1 * (t-5) / 5)) for t in T] _ACV_A8_OLD = lambda T: [1000 * sqrt(2) * np.sin(t) * t / (10 * pi) * H_num(10 - t / (100 * pi)) for t in T] if __name__ == "__main__": #create 1 period triangle x = np.linspace(0, 0.02, 4000) y = ACV_A5(x)