Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Das Radioforum. Hier dreht sich alles um die technischen Seiten des Radio- und TV-Empfangs.
Gerhard G.

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von Gerhard G. »

Hallo seventeen,

1. Du öffnest ein MS-DOS-Fenster (heißt auf Neudeutsch Windows-Eingabeaufforderung).
2. Du wechselst in das Verzeichnis, in dem Du das Skript abgelegt hast. Also z.B.
cd /d D:\Hier\ist\das\Skript
3. Du gibst ein:
eurosignal.py test.txt test.wav 100 0.6
4. Nach dem das Skript fertig ist, hast Du in dem Verzeichnis eine Datei "test.wav", die Du mit einem Player Deiner Wahl abspielen kannst.

Viel Spaß, Gerhard

Gerhard G.

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von Gerhard G. »

Hallo Schwagalla,

Du kennst Dich dort besser aus als ich... in der RegTP-Datenbank sind in der Nähe eines Ortsteils von Schmallenberg, in dem es eine "Hunaustraße" gibt, jedenfalls zwei Funktürme verzeichnet, einer davon dürfte der Eurosignal-Standort gewesen sein.

Viele Grüße, Gerhard

Kroes

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von Kroes »

@Schwagalla: Der Fernmeldeturm auf dem(?) Hunau (Grundnetzsender ZDF und WDR Fernsehen, DAB Kanal 12D) hat die genauen Koordinaten 8E22'42'', 51N12'26''. Gerundet wäre das dann eben 8E23, 51N12 - das Signal dürfte also wohl von diesem Turm gekommen sein.
Die anderen in NRW dürften auch eindeutig gewesen sein: Wesel-Büderich (Telekom-TV-Mast), Hagen=Goldberg (TV-Umsetzer ARD, ZDF, WDR), Siegen=Eisernhardt (Fernmeldeturm, DAB 12D) und Burscheid (TV-Mast, der demnächst aber kein TV mehr abstrahlt, dazu DAB 12D) - also alles Telekom-Standorte.

seventeen

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von seventeen »

Hmmm...
erstmal danke für die Hilfe, Gerhard. Jetzt habe ich es zumindest geschafft in das richtige
Verzeichnis zu kommen.

Also MSDOS-Eingabeauforderung aufgemacht cd C:\Python24\ eingegeben,
da dort die Datei eurosig.py rumliegt. Soweit alles okay. Denn vor dem Cursor steht nun "C:\Python24>".
Aber das Programm sagt nur "Befehl oder Dateiname nicht gefunden wenn "eurosig.py test.txt test.wav 100 0.6"
eingegeben wird.

hybrid

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von hybrid »

@Gerhard:
Geil gemacht, super Arbeit ! Hatte heute zum ersten Mal die Gelegenheit, das Script zu testen... allerdings fällt mir auch die "fehlende Wiederholungssequenz" auf - beim Eurosignal gab es Werte, die mehrfach wiederholt wurden - das hat man akustisch auch deutlich gemerkt... gibt es eine Möglichkeit, das noch einzubauen ?! Klar, das System dahinter haben wir noch nicht raus (welche Zahlen wiederholt wurden) - aber das kann doch im Script sicher auch der Zufall regeln, oder ? ...hmmm... sicher sind das ein paar Zeichen, aber meine Versuche bisher sind gescheitert...

tomfritz

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von tomfritz »

[Beitrag auf Wunsch des Users entfernt.]
Brubacker

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von Brubacker »

seventeen schrieb:
Also MSDOS-Eingabeauforderung aufgemacht cd C:\Python24\ eingegeben, da dort die Datei eurosig.py rumliegt. Soweit alles okay. Denn vor dem Cursor steht nun "C:\Python24>". Aber das Programm sagt nur "Befehl oder Dateiname nicht gefunden wenn "eurosig.py test.txt test.wav 100 0.6" eingegeben wird.
Heiß, ganz heiß! ;)
Ich würde nur noch ein "python" vor das ganze schreiben, dann sollte es eigentlich gehen.
Gerhard G.

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von Gerhard G. »

Hallo hybrid,

über das Phänomen der Wiederholungen habe ich auch schon nachgedacht. In dieser neuen Version des Skripts werden Nummern bis zu zweimal wiederholt, solange aufgrund niedriger Auslastung keine neuen Nummern generiert werden:

---8<------------8<------------8<---
#!/usr/bin/env python

# eurosig.py -- generates a random or predefined Eurosignal as WAV file
# Written Feb 2005 by Gerhard Grimm <gerhard dot grimm at gmx dot net>
# Donated to the Public Domain. Have fun!

import sys
from math import *
import struct
import random

class EurosignalEncoder:
"Converts a sequence of 6-digit numbers to a Eurosignal PCM waveform"
freq = [979.8, 903.1, 832.5, 767.4, 707.4, 652.0, 601.0, 554.0, 510.7, 470.8, 1062.9, 1153.1]
duration = 0.1
pause = [10, 11, 11, 11, 11, 11, 11, 11]

def __init__(self, Rate, Load, Limit, NumFile, WavFile):
"Initialize internal encoder state and set parameters"
self.rate = Rate # samples per second
self.load = Load # 0.0 .. 1.0
self.limit = Limit # how many numbers to produce
self.count = 0
self.numfile = NumFile # text file with numbers, read in player mode,
# written in random generator mode
self.wavfile = WavFile # WAV file (PCM), always written
self.phase = 0.0
self.lastnum = self.pause
self.lastcount = 0

def EncodeDigit(self, Digit):
"Encode a single digit to PCM. 10 = repetition, 11 = pause."
pcm = ''
samples = int(self.duration * self.rate)
omega = 2 * pi * self.freq[Digit]
for n in range(samples):
t = n / float(self.rate)
sample = 32000 * sin(omega * t + self.phase)
pcm += struct.pack('<h', sample)
endphase = samples / float(self.rate) * omega + self.phase
self.phase = fmod(endphase, 2 * pi)
return pcm

def DigitSequence(self, Number):
"Encode a number to a digit sequence, looking for repetitions."
if len(Number) < 6:
if self.lastcount == 3:
self.lastnum = self.pause
self.lastcount += 1
return self.lastnum
digits = []
for i in range(6):
digit = int(Number)
if (i > 0) and (digits[-1] == digit):
digit = 10
digits += [digit]
digits += [11, 11]
self.lastnum = digits
self.lastcount = 1
return digits

def WAVHeader(self):
"Provide the WAV header for the selected sample rate, 16 bit, mono."
return struct.pack('<4sL4s4sLHHLLHH4sL', 'RIFF', 36, 'WAVE', 'fmt ',
16, 1, 1, self.rate, 2 * self.rate, 2, 16,
'data', 0)

def NextNumber(self):
"Get the next number from input file or random generator."
if self.numfile.mode == 'r':
# Player mode
return self.numfile.readline()
# Random generator mode
self.count += 1
if self.count > self.limit:
return ''
result = ''
if random.random() < self.load:
for i in range(6):
result += chr(random.randint(48, 57))
result += '\n'
self.numfile.write(result)
return result

def DoGenerate(self):
"Perform the actual encoding."
self.wavfile.write(self.WAVHeader())
number = self.NextNumber()
while number:
for digit in self.DigitSequence(number):
self.wavfile.write(self.EncodeDigit(digit))
number = self.NextNumber()
# Adjust sizes in WAV header
size = self.wavfile.tell()
self.wavfile.seek(4)
self.wavfile.write(struct.pack('<L', size - 8))
self.wavfile.seek(40)
self.wavfile.write(struct.pack('<L', size - 44))

def Usage():
print 'Usage: eurosig.py <numbers file> <wav file>'
print '(to "play" an existing numbers file to a wav file)'
print 'or: eurosig.py <numbers file> <wav file> <# numbers> [<load>]'
print '(to generate a random sequence of numbers which will be logged'
print 'to a numbers file and "played" to a wav file -- load will be'
print 'assumed at 0.5 if not given)'

if __name__ == '__main__':
limit = 0
load = 0.5
if len(sys.argv) == 3:
# Player mode
num = open(sys.argv[1], 'r')
elif len(sys.argv) < 6:
# Random generator mode
num = open(sys.argv[1], 'w')
limit = int(sys.argv[3])
if len(sys.argv) == 5:
load = float(sys.argv[4])
else:
# wrong number of parameters
usage()
sys.exit(1)
wav = open(sys.argv[2], 'wb')
es = EurosignalEncoder(4000, load, limit, num, wav)
es.DoGenerate()
num.close()
wav.close()

---8<------------8<------------8<---

Da sich mehrere Stellen geändert haben, poste ich nochmal das komplette Skript. Der Wiederholungseffekt führt dazu, dass der "Load"-Parameter (letztes Argument) auf der Befehlszeile niedriger angegeben werden kann (z.B. 0.3), ohne dass zu lange Freizeichen-Perioden auftreten.
Viel Spaß damit!

Viele Grüße, Gerhard

hybrid

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von hybrid »

Prima ;) Das kommt dem Eurosignal-Effekt schon sehr nahe *g* So habe ich es in Erinnerung - allerdings habe ich den Wiederholungswert auf 3 gesetzt *g*

seventeen

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von seventeen »

Brubacker schrieb :
Heiß, ganz heiß! ;)
Ich würde nur noch ein "python" vor das ganze schreiben, dann sollte es eigentlich gehen.
Super! Jetzt hat's geklappt. Ich war dann nachdem das Script fertig war zuerst verwirrt über den Sound, da Winamp und Co. das ganze zu schnell abspielten, aber Audacity hat's dann in richtiger Geschwindigkeit geschafft.

Auch nochmal Respekt an Gerhard für die Realisierung. Der Gedankengang "Mitschnitt gesucht - Eurosignal selbst programmiert" ist mal genial.
Drift

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von Drift »

@Gerhard G.

habe gerade dein Python Script mittels vi in eine Datei geschrieben und mit chmod lauffähig gemacht.
-> Auf den ersten ENTER Druck fing die Festplatte kurz an zu rappeln, dann folgte wieder der bash-Promt. Python gehört eben zur Standardinstallation!
Jetzt noch mit XMMS gestartet...
Klasse dein Script!
Gerhard G.

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von Gerhard G. »

Hallo Drift,

genau deshalb habe ich das ganze mit Python gemacht, so hat jeder was davon. Viel Spaß!

Viele Grüße, Gerhard

Brubacker

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von Brubacker »

Nur zur Info: Inzw. ist das Skript übrigens auch bei den Downloads (Radio/DX->Downloads) samt einer kleinen Anleitung verlinkt worden.
Der Modulator

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von Der Modulator »

@Brubacker

Auf allen gängigen LINUX-Distributionen ist Python generell enthalten und gehört zur Standardinstallation.
Man muss es nicht erst aus dem Internet herunterladen !!

------------------------------------------------------------------------------



P.S. Es gibt sehr schöne Spiele, die komplett in Python geschrieben sind.

DB1BMN

Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript

Beitrag von DB1BMN »

Moin,

ist es nicht so, dass der Raspberry durch Pingewackel direkt ein UKW-Signal erzeugen kann?
Ein Schelm, wer es denn nun mit diesem Script modulieren täte ;-)
Antworten