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

Beim Schreiben von wave-File : "Data clipped...

 

schaf

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2011, 12:43     Titel: Beim Schreiben von wave-File : "Data clipped...
  Antworten mit Zitat      
Hallo,

ich habe akustische Messungen durchgeführt und die Messdaten [float32 Werte] in einer .raw Datei abgespeichert.
Nun will ich diese .raw Dateien in .wav konvertieren. Dazu lese ich zuerst alle Kanäle [72] ein in eine Matrix data, wobei jeder Kanal einer Zeile entspricht.
Nun will ich die Werte normalisieren, daher suche ich den betragsmäßg größten Wert mit

dataMax=max(max(data))
dataMin=abs(min(min(data)))

und normiere anschließend die Matrix data auf den größeren Wert von beiden und speichere jede Zeile von data mit wavwrite ab.

Nun gibt mir Matlab aber eine Warnung aus

Warning: Data clipped during write to file:20.wav
> In wavwrite>PCM_Quantize at 293
In wavwrite>write_wavedat at 309
In wavwrite at 138


Wobei die Min und Max Werte von data vor dem normieren

dataMax=4.8120
dataMin=4.6606

und nach dem normieren

testMax=1
testMin=-0.9685

sind. Also ja eigentlich kein Clipping auftreten dürfte.

Danke im Vorraus für eure Hilfe/ Antworten.

schaf


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 09.05.2011, 15:44     Titel: Re: Beim Schreiben von wave-File : "Data clipped...
  Antworten mit Zitat      
Hallo schaf,

Das klingt merkwürdig. Aus Deiner Beschreibung kann ich nicht ersehen, wo das Problem liegt. Ich glaube, die Beschreibung entspricht nicht zu 100% dem Matlab-Code.

Bitte poste den wirklichen Code, da man ansonsten den Fehler nicht finden kann. Und setze eine Debugger-Break-Point in "wavwrite>PCM_Quantize at 293", damit Du Dir die fehlerhaften Daten direkt anschauen kannst.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
schaf

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2011, 11:01     Titel:
  Antworten mit Zitat      
Hallo, hier erstmal der Sourcecode meiner Funktion

function out=raw2wavCircle(filePathPre)
tic;
stepSize=5;
irNumber=360/stepSize;
sampleRate=48000;

addpath(genpath('C:\Fraunhofer_IDMT\Matlab Scripts Spherical Array Measurement'));
reverberationTime=4;
buffer = 48000*reverberationTime;
t = 16; % time in [s]
startFreq = 20; % startFrequency in [Hz]
endFreq = 20000; % endfrequency in [Hz]
tRamp = 0.1;
[sweep inverseSweep] = generateLogarithmicSweep(t,sampleRate,startFreq,endFreq,tRamp);
inverseSweep = [inverseSweep zeros(1,buffer)];
recordingTime=length(sweep)+buffer;

fftSize=recordingTime+length(inverseSweep)-1;
for i=1:irNumber;
filePath=strcat(filePathPre,'\rawData\',int2str((i-1)*stepSize),'.raw');
fileID=fopen(filePath,'r');
%data(i,Smile=fread(fileID,fftSize,'float32');
data(i,Smile=fread(fileID,'float32');
fclose(fileID);
end;
dataMax=max(max(data))
dataMin=abs(min(min(data)))
if (dataMax>=dataMin);
for i=1:size(data,1);
for j=1:size(data,2);
data(i,j)=data(i,j)/dataMax;
end
end
else
for i=1:size(data,1);
for j=1:size(data,2);
data(i,j)=data(i,j)/dataMin;
end
end
end
testMax=max(max(data))
testMin=min(min(data))
irWaveDir=strcat(filePathPre,'\wavData\');
mkdir(irWaveDir);
for i=1:size(data,1)
irWavePath=strcat(irWaveDir,int2str((i-1)*stepSize),'.wav');
wavwrite(data(i,Smile,sampleRate,16,irWavePath);
end
toc;
end

Matlab schreibt mir in die Konsole:


dataMax =

4.8120


dataMin =

4.6606


testMax =

1


testMin =

-0.9685

Warning: Directory already exists.
> In raw2wavCircle at 44
Warning: Data clipped during write to file:20.wav
> In wavwrite>PCM_Quantize at 293
In wavwrite>write_wavedat at 309
In wavwrite at 138
In raw2wavCircle at 47
Elapsed time is 124.782610 seconds.

Das mit dem Breakpoint werde ich dann mal ausprobieren

Danke im Vorraus für die Hilfe,

schaf
 
Jan S
Moderator

Moderator


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

Der Sourcecode hilft mal wieder weiter:
Du schreibst das WAV-File mit 16 Bit Auflösung. Der Hilfetext von WAVWRITE schreibt dazu in einer Tabelle: "-1.0 <= Y < +1.0". Nur mit 32 Bit Auflösung gilt auch "-1.0 <= Y <= +1.0".
Du musst also dafür sorgen, dass die Daten kleiner als 1 sind.

Noch eine Vereinfachung und drastische Beschleunigung:
Code:

dataMax = max(max(data));
dataMax = max(dataMax, abs(min(min(data))));
data = data / dataMax;
% Kann dann wegfallen:
% if (dataMax>=dataMin);
%    for i=1:size(data,1);
%        for j=1:size(data,2);
%            data(i,j)=data(i,j)/dataMax;
%        end
%    end
%else
%    for i=1:size(data,1);
%        for j=1:size(data,2);
%            data(i,j)=data(i,j)/dataMin;
%        end
%    end
%end

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
schaf

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.05.2011, 09:44     Titel:
  Antworten mit Zitat      
Danke für die Antwort Jan S,
mal schauen wie ich das normieren auf den positiven Maximalwert mache, wobei mich das [geringe] clippen dann wahrscheinlich nicht stört.

schaf
 
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 - 2025 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.