# -*- coding: utf-8 -*- """ Created on Thu Feb 15 10:36:14 2018 @author: Hauke Brunken """ import numpy as np import math from scipy.fftpack import fft import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation sd_found = False try: import sounddevice as sd sd_found = True except: print('Das Modul "sounddevice" fehlt. Es lässt sich per "pip install sounddevice" im "Anaconda Prompt" installieren.') def playSound(sound, fs): sd.play(sound/10, fs) def spectrum(Messwerte, Abtastrate): N=len(Messwerte) u_cmplx=fft(Messwerte) u_abs=np.abs(u_cmplx[0:N//2])/N u_abs[1:] *= 2 f=np.linspace(0,Abtastrate//2,N//2) return (f,u_abs) def dataRead(**kwargs): argListMust = {'amplitude', 'samplingRate', 'duration', 'channels', 'resolution', 'outType'} argList = {'amplitude', 'samplingRate', 'duration', 'channels', 'resolution', 'outType', 'continues'} for key in kwargs: if key not in argList: print('Folgende Argumente müssen übergeben werden: amplitude=[V], samplingRate=[Hz], duration=[s], channels=[[,]], resolution=[bits], outType=\'volt\' oder \'codes\')') return None for key in argListMust: if key not in kwargs: print('Folgende Argumente müssen übergeben werden: amplitude=[V], samplingRate=[Hz], duration=[s], channels=[[,]], resolution=[bits], outType=\'volt\' oder \'codes\')') return None amplitude = kwargs['amplitude'] samplingRate = kwargs['samplingRate'] duration = kwargs['duration'] channels = kwargs['channels'] resolution = kwargs['resolution'] outType = kwargs['outType'] if 'continues' not in kwargs.keys(): continues = False else: continues = kwargs['continues'] if type(continues) != bool: print('continues muss vom Typ bool sein') return None if not all(i < 4 for i in channels): print('Mögliche Kanäle sind 0 bis 4') return None if len(channels) > len(set(channels)): print('Kanäle dürfen nicht doppelt auftauchen') return None outtType = outType.capitalize() if outtType != 'Volt' and outtType != 'Codes': print(outtType) print('outType = \'Volt\' oder \'Codes\'') return None u_lsb = 2*amplitude/(2**resolution-1) bins = [-amplitude+u_lsb/2+u_lsb*i for i in range(2**resolution-1)] ai_voltage_rngs = [1,2,5,10] if amplitude not in ai_voltage_rngs: print('Unterstützt werden folgende Amplituden:') print(ai_voltage_rngs) return None for channel in channels: if resolution < 1 or resolution > 14: print(f'Die Auflösung muss zwischen 1 und 14 Bit liegen') return None if samplingRate > 48000: print(f'Mit dieser Kanalanzahl beträgt die höchste Abtastrate 48000 Hz:') return None if continues: print('Die Liveansicht ist nicht verfügbar.') else: t = np.arange(0,duration,1/samplingRate) data = np.zeros( (len(channels),t.size)) data[0,:] = 2.5*np.sin(2*np.pi*50*t+np.random.rand()*np.pi*2) data[data>amplitude] = amplitude data[data<-amplitude] = -amplitude data = np.digitize(data,bins) if outtType == 'Volt': data = data*u_lsb-amplitude print(f"Die Messung wurde durchgeführt mit einer virtuellen Messkarte \n Messbereich: +/-{amplitude:1.2f} Volt\n samplingRate: {samplingRate:1.1f} Hz\n Messdauer: {duration:1.3f} s\n Auflösung: {resolution:d} bit\n Ausgabe in: {outtType:s}") return data