Forum: Digitale Signalverarbeitung / DSP resample in matlab


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich möchte ein audiosignal von 32kHz auf 44.1kHz "hochsamplen". Dazu 
habe ich ein Rechteck generiert und verwende die Funktion "resample" in 
Matlab/Octave. Resample wendet dabei ein Kaiser-Bessel Fenster an. 
Leider bekomme ich für ein Rechteck als Eingangssignal ein Ergebnis mit 
deutlich hörbarem Oberschwingen. Ich kann mir schon vorstellen dass das 
beim Resampling passiert da ja irgendwie interpoliert werden muss und 
durch die Impulsantwort des Fensters eben Oberschwingen entsteht, ich 
frage mich aber wie man das ohne Oberschwingen lösen könnte?

Hier ist mein Matlab code:

fs1 = 32000;
fs2 = 44100;

T = 0.001;

nSamples = T / (1/fs1);

x = [1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1]';

len = length(x);

Blocks = round(nSamples / len);

for n = 0:Blocks-1
  x(n*len+1:n*len+len) = x(1:len);
end

[p,q] = rat(fs2/fs1);

figure
plot(x)

xResample = resample(x,p,q);

figure
plot(xResample)

von Dergute W. (derguteweka)


Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Leider bekomme ich für ein Rechteck als Eingangssignal ein Ergebnis mit
> deutlich hörbarem Oberschwingen.

Ein Rechteck ist ja auch nicht bandbegrenzt. Wenn du ein bandbegrenztes 
Signal hast, was abgetastet zu sowas wird:

x = [1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1]';

dann war das kein Rechteck.

Gruss
WK

von Michael (Gast)


Bewertung
0 lesenswert
nicht lesenswert
was du mir sagen willst ist also, dass ich vorher bandbegrenzen muss 
bevor ich resample verwende?

von Michael (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Bin gerade draufgekommen.
Man braucht nur die Funktion interp1() verwenden anstatt resample(). Mit 
dem Zusatz "nearest" werden die Werte direkt verbunden anstatt mit einem 
Fenster gefiltert.

https://www.mathworks.com/help/matlab/ref/interp1.html?s_tid=doc_ta

Damit ist keine Bandbegrenzung notwendig.

von Dergute W. (derguteweka)


Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> was du mir sagen willst ist also, dass ich vorher bandbegrenzen muss
> bevor ich resample verwende?

Nein, das will ich nicht sagen. Ich will das sagen, was ich gesagt 
hatte. Nochmal - sowas hier als Folge von Samples:

x = [1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1]';

ist kein Rechteck. Das sieht fuer dich nur grad' so aus, weil du eben 
nicht zwischen 2 Samples gucken kannst, wie da das Signal verlaeuft. Du 
siehst es nur an deinen gesampleten Zeitpunkten. Und da ist's mehr oder 
weniger "zufaellig" halt grad immer 1 oder -1. Das muss es 
zwischendrinnen nicht sein. Und das es das nicht ist, faellt dann auf, 
wenn du's mit einer anderen Frequenz samplest. Dann kommen nur die 
Buckel raus, die vorher schon drinen waren (OK, weil dein Resampler auch 
nicht beliebig gut ist, baut der auch noch Fehler mit ein).

Gruss
WK

von Michael (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das ist mir alles klar und war deswegen auch nicht meine Frage.
Du brauchst nicht genau lesen aber du brauchst auch keine Antworten 
schreiben. Ist alles freiwillig.

von Dergute W. (derguteweka)


Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Das ist mir alles klar

Das glaube ich nicht, Tim.

Michael schrieb:
> aber du brauchst auch keine Antworten
> schreiben. Ist alles freiwillig.

So ist's. Ich mach' das aus reinem Jux und Dollerei - nicht weil ich 
muss.

SCNR,
WK

von Jan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Resampling und Interpolation sind nicht dasselbe. Interp1 beachtet keine 
sampleraten oder nyquist ;) da operierst du einfach stumpf auf 
Datenpunkten. Wo diese herkommen ist egal, das kann auch unphysikalisch 
sein.

Resampling betrachtet aber immer ein abgetastetes Signal unter 
Berücksichtigung des nyquist Theorems und sieht bei deinem 1->-1 Sprung 
sehr hohe Frequenzen. Dein Resampling muss aber auf die Hälfte deiner 44 
kHz bandbegrenzen, damit es kein Alias gibt. Dein interp1 macht nix 
dergleichen sondern fügt einfach nur Daten hinzu, egal was das für 
Frequenzen ergeben würden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.