Hilfe bei Datentyp Formatierung
Verfasst: Freitag 27. November 2015, 11:56
Hallo allerseits,
vor einiger Zeit hatte ich in diesem Beitrag : viewtopic.php?f=1&t=37503 meinen Sachverhalt erwähnt. Dank einer schnellen Hilfe von einem Forummitglied konnte ich das Problem lösen.
Nun stehe ich vor einer neuen Herausforderung. Das Sägezahsignal, das ich erzeuge schicke ich über die Soundkarte raus und nehme es simultan wieder auf. Soweit alles gut!
Ich soll das empfangene Signal an die UDP schnittstelle schicken und mit Matlab die Schnittstelle lauschen, ob daten vorhanden sind. Dies habe ich auch schon implementiert und die Kommunikation zwischen Python und Matlab aufgebaut. Jedoch entspricht das Signal, was ich sende nicht dem, was ich in Matlab empfange.
Durch einige Tests habe ich festgestellt, dass es an dem Datentyp liegt. Denn das Sägezahnsignal, was aufgenommen wird, ist als 2 byte - character abgespeichert. Wie schaffe ich es die Daten an die UDP Schnittstelle zu schicken, sodass ich in Matlab wieder das richtige Signal auswerten kann?
Hier die Funktionen, die für den Sachverhalt relevant sind:
Hinweis: Nur durch die Amplitude von A= 600 erreiche kann ich in Matlab ein Sägezahnsignal von -1 bis 1 plotten.
Für Unterstützungen, Ideen danke ich schon im Voraus.
Viele Grüße
DerIng
vor einiger Zeit hatte ich in diesem Beitrag : viewtopic.php?f=1&t=37503 meinen Sachverhalt erwähnt. Dank einer schnellen Hilfe von einem Forummitglied konnte ich das Problem lösen.
Nun stehe ich vor einer neuen Herausforderung. Das Sägezahsignal, das ich erzeuge schicke ich über die Soundkarte raus und nehme es simultan wieder auf. Soweit alles gut!
Ich soll das empfangene Signal an die UDP schnittstelle schicken und mit Matlab die Schnittstelle lauschen, ob daten vorhanden sind. Dies habe ich auch schon implementiert und die Kommunikation zwischen Python und Matlab aufgebaut. Jedoch entspricht das Signal, was ich sende nicht dem, was ich in Matlab empfange.
Durch einige Tests habe ich festgestellt, dass es an dem Datentyp liegt. Denn das Sägezahnsignal, was aufgenommen wird, ist als 2 byte - character abgespeichert. Wie schaffe ich es die Daten an die UDP Schnittstelle zu schicken, sodass ich in Matlab wieder das richtige Signal auswerten kann?
Hier die Funktionen, die für den Sachverhalt relevant sind:
Code: Alles auswählen
def make_sawtooth(f0=100,A=1,fs=96000):
n=int(fs/f0)
wav=''
for i in range(0,n):
Saw=int(A*signal.sawtooth(-i*2*np.pi*f0/fs))
#print "Sawtooth:", Saw
wav +=chr(Saw & 0xFF) + chr((Saw & 0xFF00) >> 8)
return wav
#plt.plot(Saw)
#plt.show()
def play_audio(forHowLong):
data= make_sawtooth(f0=200,A=600,fs=96000)
#data2= sin_wave(f0=400,A=600,fs=96000)
p = pyaudio.PyAudio() #sets up portaudio system
stream = p.open(format=p.get_format_from_width(2),
channels=1,
rate=96000,
output=True)
start = time.time()
while time.time() < start + forHowLong:
stream.write(data)
stream.stop_stream()
stream.close()
p.terminate()
def record_audio(forHowLong):
NUM_SAMPLES = 512
FORMAT = pyaudio.get_format_from_width(2)
CHANNELS = 1
RATE = 96000
RECORD_SECONDS = forHowLong
WAVE_OUTPUT_FILENAME = "output.wav"
UDP_IP ="129.69.32.192"
UDP_PORT=5005
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=NUM_SAMPLES)
print("* recording")
r= array('c')
frames = []
start = time.time()
while time.time() < start + forHowLong:
data=array('c',stream.read(NUM_SAMPLES))
if byteorder == 'big':
data=byteswap()
r.extend(data)
# frames.append(data)
print("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
print "Datalength:",len(data)
sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
try:
sock.connect((UDP_IP,UDP_PORT))
except:
print "Connection failed"
sock.send(value)
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(r))
wf.close()
print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORTFür Unterstützungen, Ideen danke ich schon im Voraus.
Viele Grüße
DerIng