Bandbegrenztes Rauschsignal

Für eine Anwendung in der elektronischen Musik möchte ich ein Signal y=f(t) erzeugen, das im Frequenzbereich wie ein Rechteck aussieht. Also ein Signal, das nur Frequenzen innerhalb eines bestimmten Frequenzbandes enthält.

Betrachten wir zum Beispiel den Zeitbereich von einer Sekunde, und summieren fünf Sinuswellen mit gleicher Amplitude auf, mit den Frequenzen 50Hz, 51Hz, 52Hz, 53Hz und 54Hz. Das Summensignal sieht so aus:

formatting link
Die Periodendauer von einer Sekunde ist klar erkennbar und das Signal hört sich ganz und gar nicht wie bandbegrenztes Rauschen an. Der Spitzenwert des Signals entspricht ungefähr der Amplitude der einzelnen Sinuswellen multiplizert mit deren Anzahl, in diesem Beispiel 5.

Als zweites Beispiel habe ich jede der fünf Sinuswellen mit einer zufällig gewählten Phasenverschiebung versehen. Dann sieht das so aus:

formatting link
Das hört sich schon viel besser an. Die Periodendauer von einer Sekunde ist im Zeitbereich nicht mehr klar erkennbar (und auch nicht mehr so deutlich hörbar), und der Spitzenwert des Summensignals ist kleiner geworden.

Nun meine Frage: Kann man irgendwie "optimale" Phasenverschiebungen für die Sinuswellen berechnen, so dass der Spitzenwert des Summensignals minimal wird?

Gruß Michael

Reply to
astroel...
Loading thread data ...

Eine Fourier-Reihe, die ein perfektes Rechteck ergibt, hat unendlich viele Sinus-Signale. Die jeweiligen Phasenverschiebungen sind darin enthalten. Was sich /am besten/ anhört, weiß ich nicht.

Reply to
Helmut Schellong

Helmut Schellong schrieb am Mittwoch, 3. Mai 2023 um 11:18:51 UTC+2:

Das ist natürlich richtig. Da ich das Signal mit einem Microcontroller erzeugen möchte, indem ein Array ausgelesen wird, muss das Signal eine endliche Periodendauer haben, zum Beispiel eine Sekunde. Dann kann das Signal aber nur eine endliche Anzahl von Frequenzen enthalten, nämlich Vielfache von 1Hz. Wenn andere Frequenzen enthalten wären, dann wäre am Ende der Tabelle ein Sprung (der unerwünschte Frequenzanteile enthält). Die Frage ist, wie man die Phasenlage der einzelnen Frequenzen wählen muss, damit sich das Signal möglichst "gut" oder "zufällig" anhört.

Gruß Michael

Reply to
astroel...

Scharf begrenztes Signal im Frequenzbereich bedeutet langes Signal im Zeitbereich.

Sieht alles nicht wie Rauschen aus.

Auch da kommt kein Rauschsignal heraus.

Die Loesung ist das gewuenschte Spektrum zu erzeugen, mittels Zufallsgenerator und es mittels diskreter Fourier Ruecktransformation in ein Zeitsignal zu verwandeln.

formatting link
Man muss nur die Regel unter "conjugate symmetry" beachten. N sollte eine Zweierpotenz sein, je groesser man N waehlt umso genauer wird es.

Reply to
Carla Schneider

Carla Schneider schrieb am Mittwoch, 3. Mai 2023 um 12:02:11 UTC+2:

Das Spektrum besteht aus Real- und Imaginärteil, oder aus Betrag und Phase. Wie der Betrag aussehen soll ist klar. Aber wie muss die Phase aussehen? Man kann die Phase per Zufallsgenerator berechnen. Das habe ich schon ausprobiert. Dabei könnte sich aber auch ein Signal ergeben, dass sich nicht gut anhört weil man die 1s Periode zu deutlich hören kann, siehe erstes Beispiel. Ich bin noch nicht davon überzeugt dass es der beste Weg ist, die Phase per Zufallsgenerator zu berechnen. Vielleicht gibt es einen besseren Weg?

Gruß Michael

Reply to
astroel...

Die Addition von Sinus-Funktionen zur Erzeugung von Rauschen mit kontrollierter Frequenz-Charakteristik wird aber auch auf manchen Web-Seiten beschrieben, so etwa auf "Noise Functions and Map Generation" (von Amit Patel?).

Dabei ist es - laut der Web-Seite - tatsächlich wichtig, daß jeder Summand eine zufällige Phasenverschiebung erhält.

Wenn man zwei Aufnahmen von weißem Rauschen hintereinander schneidet, sollte dies keine zusätzlichen Störungen einführen, da ja ohnehin jeder Wert zufällig sein soll. Bei anderen Arten von Rauchen könnten aber vermutlich tatsächlich zusätzliche Frequenzanteile entstehen, die unerwünscht sind. Man kann aber wenigsten die grobe Störung eines "Klicks" vermeiden, wenn man dort aneinanderschneidet, wo die Amplitude gleich ist (und am besten auch die Steigung).

Reply to
Stefan Ram

Real und Imaginaerteil per Zufallszahl zwischen -1 und +1 berechnen. Das Spektrum muss doppelt drin sein d.h. bei n=1024 muss es in die ersten 512 und gespiegelt in die zweiten 512, wobei da der imaginaerteil dann das negative von dem im ersten ist. Das Rechteckfenster muss entsprechend auch 2 mal rein.

Wenn du kein Rauschen willst, sondern ein besseres Signal, auf jeden Fall, nur wie ist "besser" in diesem Fall definiert ?

Reply to
Carla Schneider

Carla Schneider schrieb am Mittwoch, 3. Mai 2023 um 14:46:14 UTC+2:

Das wäre ein Quadrat in der komplexen Ebene. Es muss aber ein Kreis sein. Beim Quadrat hätten wir je nach Phasenwinkel unterschiedlich große Beträge, maximal 1 bei Phasenwinkel 0° und maximal 1.41 bei Phasenwinkel 45°. Was dazu führt dass der Phasenwinkel 45° mit höherer Wahrscheinlichkeit vorkommen würde als der Phasenwinkel 0°.

Das ist eine gute und berechtigte Frage. "besser" ist wenn man die Wiederholfrequenz des periodischen Signals (ca. 1Hz) nicht gut heraushören kann. Das ist möglicherweise gleichbedeutend mit einen möglichst kleinen Spitzenwert. Siehe erstes Beispiel, der Spitzenwert ist 5 und die Wiederholfrequenz ist deutlich hörbar. So soll es nicht sein.

Gruß Michael

Reply to
astroel...

Inzwischen habe ich ein Computerprogramm geschrieben, das einen hörbaren Klang erzeugt.

In der letzten Schleife werden 10 Frequenzen zu einem Grundton addiert, deren Frequenz jeweils in 1,1-, 1,2-, 1,3- usw. -faches des Grundtons ist. (Bzw.: n Frequenzen, deren Frequenz jeweils ein (1+(i/n))-faches des Grundtones (440 Hz) ist.)

Man hört dann einen Klang mit einer Amplitudenmodulation, einer Art von Schwebung. Hier spielt vermutlich die Identität

sin x + sin y = 2 sin( ( x + y )/ 2 ) cos( ( x - y )/ 2 )

eine Rolle, bei der die Schwebungsfrequenz "( x - y )/ 2" ist.

Die Additions eines Phasenversatzes ("1 * self.shift[ i ]" unten) ergibt hier keinen deutlich hörbaren Unterschied.

class instrument2: # for noise experiments def __init__( self ): self.n = 10 self.shift =[ 0 ]* self.n for i in range( self.n ): self.shift[ i ]= random.random() * 2 * pi def instrument_of( self, frame_number ): current_angle = self.frequency_multiplier * frame_number frame_value = 0 for i in range( self.n ): f = 1 + i / self.n frame_value += \ sin( f * current_angle + 1 * self.shift[ i ])/self.n return frame_value

(Dieser Python-Quelltext stammt aus einem größeren Python-Programm für Windows, das auf Anfrage erhältlich ist.)

Anders ist es, wenn ich 100 Frequenzen verwende, also oben "self.n" = 100 setze. Dann ergibt sich mit "+ 0 * self.shift[ i ]" eine Art von Ton mit einer Art von Schwebung, aber bei zufälligen Versatzen mit "+ 1 * self.shift[ i ]" schon eher ein Rauschen, das aber noch eine hörbare Schwebung hat und wie ein Ufo aus der Fernsehserie "Ufo" klingt.

Bei "self.n = 1000" dauert die Berechnung des Klangs eine Weile. Dann höre ich bei kohärenten Sinus-Summanden ("0 * ...") einen Ton, der wie beim Zupfen einer Seite schnell leiser wird, und dann wieder langsam lauter (also eine Art von Schwebung mit sehr niedriger Frequenz); bei Inkohärenz aber etwas, das schon mehr einem Rauschen ähnelt, das aber immer noch so eine Art Schwebung (Amplituden-Modulation) hat, aber weniger als zuvor. Es klingt etwas wie kräftiger Wind, der Geräusche an Häuserkanten erzeugt und man hat den Eindruck, also ob das Signal durch einen Bandpass gegangen sein könnte.

Für n = 10000 habe ich jetzt keine Zeit mehr, aber es deutet sich für mich an, daß dies dann bei Inkohärenz ein Rauschen mit gleichmäßigerer Lautstärke ergeben könnte.

Reply to
Stefan Ram

Wie schon geschrieben wurde, hängt die Flankensteilheit dieses Rechtecks u.a. von der Länge Deines Zeitsignals ab. Beliebig "rechteckig" wird also mit einem Signal nicht gehen, dessen Dauer begrenzt ist.

Du könntest aber ein Weißes Rauschen nehmen - generiert als Pseudo-Zufallszahlenfolge mit z.B. einem Maximalfolgen- generator oder durch ein digitalisiertes analoges, "echtes" Rauschsignal - und das dann z.B. mit einem linearphasigen Filter (FIR-Filter) auf die gewünschte Bandbreite filtern.

Je nach Eckfrequenzen kann ein pasendes FIR-Filter zwar aufwändig werden, wenn Du aber nur die Abtastwerte des Ausgangssignals in einer Tabelle speichern willst, macht das (und eine ggf. spürbare Latenz) ja eigentlich wenig bis gar nichts.

Viele Grüße

Dieter

Reply to
Dieter Michel
Reply to
Hans-Juergen Schneider

Hier sieht man bei 1000 addierten Sinusfunktionen in einer Oktave einmal die Situation bei kohärenter Addition und 10 Schwingungen der kleinsten Frequenz der Summe:

  • * * * * *
  • ** *** ***** ***** ***** ***** **** ***** ***** ** * * * * ** ** *** *** ** ** * * * * * * und einmal die nicht-kohärente Situation (mit zufälligen Phasen):
  • * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * ** * * * * * * * * *
  • * * * * * * ** * * * * * * * * * * * * * * * * ** *

from math import sin, pi from random import random

n = 1000 k = False # Kohärenz?

shift =[ 0 ]* n for i in range( n ): shift[ i ]= random()* 2 * pi

X = 72 Y = 24 H = Y/2 h = H - 1 screen =[ [] ]* Y value =[ [] ]* X max = 0

for row in range( Y ): screen[ row ] =[ ' ' ]* X for col in range( X ): x = col / X * 2 * pi * 10 y = 0 for i in range( n ): y += sin( x *( 1 + i/n ) +( 1 - k )* shift[ i ]) value[ col ]= y if y > max: max = y if -y > max: max = -y

for col in range( X ): y = value[ col ]/ max row = h * y + H row = int( row ) col = int( col ) if row < 0: row = 0 if col < 0: col = 0 if row > Y - 1: row = Y - 1 if col > X - 1: col = X - 1 screen[ row ][ col ]= '*' for row in range( Y - 1, -1, -1 ): print( ''.join( screen[ row ]))

Reply to
Stefan Ram

Am 03.05.23 um 09:39 schrieb snipped-for-privacy@t-online.de:> Für eine Anwendung in der elektronischen Musik möchte ich ein Signal y=f(t) erzeugen, das im Frequenzbereich wie ein Rechteck aussieht. Also ein Signal, das nur Frequenzen innerhalb eines bestimmten Frequenzbandes enthält. Kein Problem. Nimm eine hinreichend große Zweierpotenz an Samples, nach der sich das Signal wiederholen darf, sowas wie 65536 oder 232144. (Das begrenzt auch die Bandbreite nach unten.) Dann erzeugst du das Zielsignal in der Frequenzdomäne. Also Amplitude(f) nach Wunsch und Phase = Zufallszahl. Die Polarkoordinaten in komplexe Zahlen umwandeln und inverses FFT darüber laufen lassen. Ergebnis geeignet normalisieren und fertig. BTDT.

Wenn man die Amplitude noch mit f^kappa gewichtet, bekommt man auch rosa Rauschen (kappa = -.5) oder beliebige andere Energieverteilungen.

Mit systematischen Phasen bekommt man andere, zuweilen durchaus sinnvolle Signale. Mit einer Phase proportional zu f² bekommt man z.B. ein Chirp. Wenn man die Parabel so normiert, dass es genau einmal bis

360° geht, bekommt man einen Crest-Faktor wie bei einer Sinuswelle.

Marcel

Reply to
Marcel Mueller

snipped-for-privacy@t-online.de schrieb:

Je mehr Frequenzen du so addierst, desto schärfer wird eine Pulsfolge. Die Picoscope-Oszis haben einen DSS, der etwa 10 Frequenzen verwendet und so eine Pulsfolge erzeugt. Mit entsprechendem Spektrum. Technisch wird das in modengekoppelten Kurzpuls-Lasern verwendet.

Wenn du noch die Amplituden auswürfelst wie die Phasen, dann sieht das Signal aus wie der Ausgang eines gepulsten Lasers ohne Modenkopplung. Interessant, bringt dich aber nicht weiter.

Muss das numerisch erzeugt werden? Ansonsten kann man einen Rauschgenerator nehmen und mit einem gesteuerten parametrischen Filter (Biquad mit gesteuerten OTAs oder so) ein Frequenzband rauspicken.

Reply to
Rolf Bombach

Carla Schneider schrieb:

... damit man FFT nehmen kann. Die DFT akzeptiert alle Werte für N, wie im Artikel beschrieben.

Desto länger ist aber das Array, zeitlich. Nur mehr N bei gleichem Beobachtungszeitraum erhöht lediglich die Grenz- frequenz, hat dann aber keinen Einfluss auf das Frequenz- Raster. Dieses ist durch den Erfassungszeitraum gegeben.

Reply to
Rolf Bombach

Man muesste also zufallszahlen erzeugen im Quadrat, und nur die weiter verwenden die auch im Kreis liegen.

Da wuerde es sich doch anbieten die Wiederholfrequenz so klein zu machen dass sich innerhalb eines Tons nichts wiederholt.

Reply to
Carla Schneider

Marcel Mueller schrieb am Mittwoch, 3. Mai 2023 um 21:30:42 UTC+2:

Wenn man viele Sinuswellen aufsummiert, dass ist es wohl der richtige Weg die Phasenverschiebungen per Zufall zu erzeugen. Aber wenn die Anzahl der Sinuswellen relativ klein ist, dann führt dieses Verfahren nicht zwangsläufig zum bestmöglichen Ergebnis (kleinstmöglicher Spitzenwert). Wenn man zum Beispiel nur drei Sinuswellen aufsummiert, dann ergibt sich der kleinstmögliche Spitzenwert genau dann wenn man die dritte Welle um 180° verschiebt: y = sin(2 pi * 50 x) + sin(2 pi * 51 x) + sin(pi +2 pi * 52 x)

Interessant. Das muss ich mal ausprobieren.

Michael

Reply to
astroel...

Die Addition vieler Sinuswellen mit variabler Phase unter der Randbedingung "bitte nicht übersteuern" ist nicht trivial -- irgendwo blieb bei mir hängen, das wer dazu einen evolutionären Algorithmus verwendet hatte -- also letztendlich mehr oder weniger gezielt ausprobieren.

War was aus dem Bereich alte Fernsprechtechnik, Testsignal bandbegrenzt und amplitudenbegrenzt, aber bitte nahe and der maximal möglichen Aussteuerung, sowas... Keine Ahnung warum das im Zeitbereich sein musste.

Thomas Prufer

Reply to
Thomas Prufer

Thomas Prufer schrieb am Donnerstag, 4. Mai 2023 um 08:52:49 UTC+2:

In diese Richtung experimentiere ich gerade. Wenn man zwei Sinuswellen mit leicht unterschiedlicher Frequenz addiert, dann ist der Spitzenwert 2 weil die Wellen an irgendeiner Stelle im Zeitbereich konstruktiv interferieren. Das kann man auch mit Phasenverschiebungen nicht verhindern. Also brauchen die ersten beiden Wellen keine Phasenverschiebung. Bei der dritten Welle kann man die Phasenverschiebung gezielt so legen, dass an der Stelle wo die ersten beiden Wellen konstruktiv interferieren die dritte Welle destruktiv interferiert. Und so weiter. Man sucht im Zeitbereich den Spitzenwert, und verschiebt die nächste Welle so dass sie den bisherigen Spitzenwert nicht noch größer macht. Dadurch entsteht ein neuer Spitzenwert an einer anderen Stelle.

Michael

Reply to
astroel...

Hallo Michael,

mal eine neugierige Frage: Du schriebst ursprünglich, dass Du ein Signal erzeugen möchtest, das im Frequenzbereich wie ein Rechteck aussieht, für eine Anwendung in der elektronischen Musik.

Heißt das, dass Dir ein bestimmter Klang vorschwebt, den Du jetzt realisieren möchtest?

Wenn Dir klanglich der Höreindruck "Rauschen, aber bandbegrenzt" vorschwebt, würde ich das auch genau so erzeugen - also ein Rauschsignal bandbegrenzen.

Wenn es Dir darum geht, ein Signal mit einem möglichst niedrigen Crest-Faktor zu erzeugen mit einem im Rahmen der Analysedauer rechteckförmigen Spektrum, dann kannst Du auch einen Sinus-Sweep erzeugen, der während der Länge des Analyse-Zeitfensters den von Dir gewünschten Frequenz- bereich durchläuft.

Das klingt dann aber natürlich anders als Rauschen, deshalb würde ich das an Deiner Stelle nicht mit der Addition von Sinusfunktionen machen - obwohl das auch geht - sondern von dem Klangcharakter des gewünschten Signals ausgehen.

Viele Grüße

Dieter

Reply to
Dieter Michel

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.