Forum: Digitale Signalverarbeitung / DSP / Machine Learning resample in matlab


von Michael (Gast)


Angehängte Dateien:

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)


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)


Lesenswert?

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

von Michael (Gast)


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)


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)


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)


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.