In einigen Zeitungen habe ich gelesen, dass das additive Rauschen bandbegrenztes Gauß-Weiß ist.
Wie kann ich diese Art von Lärm mit MATLAB simulieren?
In einigen Zeitungen habe ich gelesen, dass das additive Rauschen bandbegrenztes Gauß-Weiß ist.
Wie kann ich diese Art von Lärm mit MATLAB simulieren?
Antworten:
Sie würden ein bandbegrenztes Gaußsches Rauschen erzeugen, indem Sie zuerst weißes Rauschen erzeugen und es dann auf die gewünschte Bandbreite filtern. Als Beispiel:
% design FIR filter to filter noise to half of Nyquist rate
b = fir1(64, 0.5);
% generate Gaussian (normally-distributed) white noise
n = randn(1e4, 1);
% apply to filter to yield bandlimited noise
nb = filter(b,1,n);
Nur eine kleine Ergänzung zu Jasons Antwort: Normalerweise müssen Sie bandbegrenztes Rauschen mit einer gegebenen Varianz erzeugen . Sie können diesen Code zu dem Code in Jasons Antwort hinzufügen:
var = 3.0; % just an example
scale = sqrt(var)/std(nb);
nb = scale*nb; % nb has variance 'var'
Beachten Sie, dass Sie die Skalierung nach dem Filtern durchführen müssen, da der Filter im Allgemeinen die Rauschvarianz ändert.
Jedes Mal , wenn diskrete Rauschproben (mit MATLAB generieren randn
/ rand
zum Beispiel) Sie erzeugen tatsächlich eine Band begrenzt Rauschen.
Alles, was Sie tun müssen, ist die Anpassung der Varianz der diskreten Samples an die Varianz des "kontinuierlichen" Rauschens, aus dem diese Samples stammen sollen.
Eine vollständige Beschreibung finden Sie hier - So simulieren Sie AWGN (Additives Weißes Gaußsches Rauschen) in Kommunikationssystemen für eine bestimmte Bandbreite .
Warum kann man den in diesem Beitrag erwähnten Ansatz nicht anwenden ?
Es beginnt mit den gewünschten Frequenzen und arbeitet rückwärts, um das Signal aufzubauen, anstatt zu filtern. Es verwendet Python-Code, verlinkt aber auch auf den ursprünglichen Matlab-Code.
Gibt es irgendwelche Nachteile, wenn man es so macht?
Ich erkenne, dass diese Frage in der aktuellen Ansicht aufgetaucht ist, weil @Drazick seine / ihre 2013-Antwort geändert hat.
rand()
frand()
"Weißes Rauschen" ist natürlich auch für analoge Signale eine Fehlbezeichnung. Ein "Leistungssignal" mit flachem Spektrum bis ins Unendliche hat ebenfalls unendliche Leistung. Das wie beschrieben erzeugte virtuell-gaußsche und "weiße" Signal hat eine endliche Potenz (die Varianz und ist 1) und eine endliche Bandbreite, die, einseitig ausgedrückt, Nyquist ist. (Die "spektrale Leistungsdichte" oder Leistung pro Frequenzeinheit beträgt also 1 / Nyquist.) Skalieren und versetzen Sie sie nach Belieben.
Ich nehme an, ich kann dies später bearbeiten und C-ähnlichen Pseudocode hinzufügen, um dies explizit zu zeigen.
Wenn Sie Vollspektrum-Weißrauschen erzeugen und es dann filtern, möchten Sie eine Wand Ihres Hauses weiß streichen. Daher entscheiden Sie sich, das ganze Haus weiß zu streichen und dann das gesamte Haus mit Ausnahme der Wand zurückzustreichen. Ist idiotisch. (Hat aber Sinn in der Elektronik).
Ich habe ein kleines C-Programm erstellt, das bei jeder Frequenz und Bandbreite weißes Rauschen erzeugen kann (z. B. bei 16 kHz Zentralfrequenz und 2 kHz "breit"). Keine Filterung erforderlich.
Was ich getan habe, ist einfach: Innerhalb der Hauptschleife (Endlosschleife) generiere ich eine Sinuskurve mit einer Mittenfrequenz von +/- einer Zufallszahl zwischen einer halben Bandbreite und einer halben Bandbreite, dann behalte ich diese Frequenz für eine beliebige Anzahl von Abtastwerten (Granularität) und dies ist das Ergebnis:
Weißes Rauschen mit einer Breite von 2 kHz und einer Mittenfrequenz von 16 kHz
Pseudocode:
while (true)
{
f = center frequency
r = random number between -half of bandwidth and + half of bandwidth
<secondary loop (for managing "granularity")>
for x = 0 to 8 (or 16 or 32....)
{
[generate sine Nth value at frequency f+r]
output = generated Nth value
}
}