WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Faltung und Normalisieren von Audiosignalen: clipping

 

flargoesmatlab
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2013, 13:34     Titel: Faltung und Normalisieren von Audiosignalen: clipping
  Antworten mit Zitat      
Hallo,

ich möchte 2 Audiosignale falten. Das gefaltete Signal möchte ich anschließend normalisieren. Bei der Erstellung mittels wavwrite() bekomme ich eine Warnung von Matlab "Data clipped during write to file....". eben das Clipping möchte ich ja mit diesem Schritt vermeiden. Exportierte ich jedoch das nichtnormalisierte File bekomme ich keine Clipping Warnung. Ich wäre sehr dankbar wenn mir dabei jemand weiterhelfen könnte, da ich nicht weiß wo der Fehler ist.
Hier mein Code:
Code:
%
% M-File: Convolution
%% diese Funktion ließt eine Impulsantwort und ein signal ein, faltet diese und exportiert das Ergebnis

ir = wavread ('E:....');%%laden der Impulsantwort
signal = wavread ('E:...'); %%laden des Signals

irLength= length (ir)

signalLength= length(signal)
convSignal = conv( signal, ir);  %% Faltung
convSignalNorm = convSignal/max(convSignal); %% Normalisieren von convSignal, damit kein Wert > 1


wavwrite(convSignalNorm,48000,'E:\...'); %%Ausgabe des gefalteten Signals
%


[EDITED, Jan, Bite Code-formatierung verwenden - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.05.2013, 21:58     Titel: Re: Faltung und Normalisieren von Audiosignalen: clipping
  Antworten mit Zitat      
Hallo flargoesmatlab,

Wie sehen denn die Daten aus? Schaue doch einfach mal rein um das Problem zu finden:
Code:
max(convSignal)
min(convSignal)
class(convSignal)
convSignalNorm = convSignal/max(convSignal);
max(convSignalNorm)
min(convSignalNorm)
class(convSignalNorm)

Was würde denn passieren, wenn conSignal = [-0.9, 0.0001] ist?

Wenn die Anzahl der Bits nicht angegeben ist, schreibt WAVWRITE mit 16 Bits als Default. Dann ist der erlaubte Range nur: -1.0 <= Y < +1.0. +1 ist also explizit ausgeschlossen!

Gruß, Jan

Zuletzt bearbeitet von Jan S am 06.05.2013, 20:25, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2013, 18:21     Titel:
  Antworten mit Zitat      
du normalisierst dein Signal mit max(signal), das gibt allerdings nur denn größten positiven Wert zurück, aber der Betrag ein negativen Wertes kann natürlich noch größer sein, daher normalisier mal mit max(abs(signal))

viele Grüße,
René
 
flargoesmatlab
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2013, 17:37     Titel:
  Antworten mit Zitat      
Hey,

auch mit max(abs(convSignal)) kommt die Clipping Warnung leider immernoch.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.05.2013, 23:24     Titel:
  Antworten mit Zitat      
Hallo flargoesmatlab,

Ich wiederhole es nochmal:
Zitat:
Wenn die Anzahl der Bits nicht angegeben ist, schreibt WAVWRITE mit 16 Bits als Default. Dann ist der erlaubte Range nur: -1.0 <= Y < +1.0. +1 ist also explizit ausgeschlossen!

Du hast bisher noch nicht darauf reagiert.

Wenn Du also "wavwrite(y,48000,'E:\...')" schreibst, führt ein +1.0 in y zu der genannten Warnung betreffend des Clippings. Siehe "help wavwrite".
Eine Abhilfe ist die Umwandlung in INT16 und das explizite Ausschließen des nicht akzeptierten Wertes:
Code:
y = rand(1, 1000) * 2 - 1;  % Testdaten -1.0<=y<=1.0
yInt = int16(y * 32768);
yInt(yInt == int16(32768)) = int16(32767);

Oder aber Du schreibst das WAV mit 32 Bits, so dass auch +1.0 erlaubt ist.

Mit "Wie sehen Deine Daten denn aus?" meinte ich, dass Du die Ausgaben der gezeigten Befehle "max(convSignal) ..." hier im Forum posten könntest. Dann wäre eine zielsichere Hilfe möglich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
flargoesmatlab
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 16.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2013, 14:56     Titel:
  Antworten mit Zitat      
Hi,

sorry ich war leider unterwegs.

Danke für den guten Tip, das werde ich ausprobieren. Sollte das nicht klappen poste ich die Daten.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.