|
|
Beim Schreiben von wave-File : "Data clipped... |
|
schaf |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 06.05.2011, 12:43
Titel: Beim Schreiben von wave-File : "Data clipped...
|
 |
|
 |
|
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
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 09.05.2011, 15:44
Titel: Re: Beim Schreiben von wave-File : "Data clipped...
|
 |
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
|
|
|
schaf |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 12.05.2011, 11:01
Titel:
|
 |
|
 |
|
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, =fread(fileID,fftSize,'float32');
data(i, =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, ,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
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 12.05.2011, 23:51
Titel:
|
 |
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:
Gruß, Jan
|
|
|
schaf |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 18.05.2011, 09:44
Titel:
|
 |
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
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|