Verfasst am: 26.04.2017, 21:13
Titel: Bug bei audioread
Liebes Forum!
Scheinbar habe ich ein Octave Problem entdeckt - welches mir sehr Kopfzerbrechen bereitet:
der Befehl "audioread" mit der DATATYPE 'native' macht Mist...
sig_diff = sig_matlab-sig_octave; % bilde die Differenz der beiden Signale (sollte 0 sein)
sig_diff_fault = find(sig_diff~=0); % Wo ist sie ungleich Null? figure, stem(sig_diff(sig_diff_fault))
sig_diff2 = sigINT-sig_octave; % bilde die Differenz der beiden Signale (sollte 0 sein)
sig_diff2_fault = find(sig_diff2~=0); % Wo ist sie ungleich Null? figure, stem(sig_diff2(sig_diff2_fault))
Wo macht Octave hier Mist? Du schreibst ja nichts dazu aber man könnte meinen du meinst die +/-1 Differenz in sig_diff. Das könnte durch Rundung entstehen und ist, wenn du das SNR durch die Quantisierung betrachtest, vernachlässigbar.
Das Problem an der Sache ist:
im LSB von dem 16 bit Audio Signal ist eine wichtige Information codiert...
dieses Bit gehört eigentlich nicht zum Audio (wird bei der Aufnahme schon so gemacht...).
Kann ich dieses Bit nicht richtig auslesen - kann ich alle Messdaten schmeißen...
Ich habe 600 Mess .wav's und bei ca. 20 gibts da Probleme - und ich weis nicht warum...
Octave braucht da gar nichts runden - ich möchte einfach das LSB einlesen...
... bin etwas verzweifelt... sorry...
bei "native" wird also das wav als double gelesen und dann als uint16/whatever skaliert. Wie schon von mir gesagt, entstehen deine +/-1 genau durch diese Rundung.
Hättest du gleich zu Beginn gesagt, dass das LSB in der Rohdaten wichtig ist, hätten wir uns etwas Zeit und Nerven sparen können.
Eine mögliche Lösung ist offensichtlich: mach ein kleines.oct und verwende sf_read_int anstatt sf_read_float, kompilieren mit mkoctfile
Lieber Andy!
Danke für die Aufklärung!
Ich versuche nun ein oct file zu erstellen - kome aber nicht weiter - bitte deshalb wieder um Hilfe!
Ich bekomme beim Kompilieren folgenden Fehler:
Code:
In file included from defun-dld.h:32:0,
from audioreadJF.cc:34:
audioreadJF.cc: In function 'octave_function* Gaudioread__JF(const octave::dynamic_library
&, bool)':
audioreadJF.cc:54:34: error: 'doc' was not declared in this scope
DEFUN_DLD (audioread__JF, args, ,doc: /* -*- texinfo -*-
^
C:\Octave\Octave-4.2.0\include\octave-4.2.0\octave/defun-int.h:123:56: note: in definition
of macro 'DEFINE_FUNX_INSTALLER_FUN'
= octave_dld_function::create(fname, shl, name, doc); \
^
defun-dld.h:47:3: note: in expansion of macro 'DEFINE_FUN_INSTALLER_FUN'
DEFINE_FUN_INSTALLER_FUN (name, doc) \
^
audioreadJF.cc:54:1: note: in expansion of macro 'DEFUN_DLD'
DEFUN_DLD (audioread__JF, args, ,doc: /* -*- texinfo -*-
@deftypefnx {}{[@var{y}, @var{fs}] =} audioread__JF (@var{filename}, @var{datatype})
@deftypefnx {}{[@var{y}, @var{fs}] =} audioread__JF (@var{filename}, @var{samples}, @var{datatype})
Read the audio file @var{filename} and return the audio data @var{y} and
sampling rate @var{fs}.
The audio data is stored as matrix with rows corresponding to audio frames
and columns corresponding to channels.
The optional two-element vector argument @var{samples} specifies starting
and ending frames.
The optional argument @var{datatype} specifies the datatype to return.
If it is @qcode{"native"}, then the type of data depends on how the data
is stored in the audio file.
@end deftypefn */) {
#if defined (HAVE_SNDFILE)
Kompilieren wie im Kommentar beschrieben. Ich habe soweit alles rausgeworfen, was sonst nicht gebraucht wird. Ggf. musst du bissle testen, dass ich die Kanäle nicht vertauscht oder sowas.
Btw, wenn du von einem GPL Programm kopierst, solltest du immer einen Verweis auf das original drin lassen und dein Programm auch unter die GPL stellen
Lieber Andy!
Danke für deine Arbeit - leider funktioniert es nicht so wie gehofft!
Die eingelesenen Daten ergeben noch weniger Sinn...
Die beiden Kanäle (L,R) sind nicht in die Spalten 1 und 2 aufgeteilt, sondern in der ersten Spalte befindet sich zuerst der Wert von L und der zweite Wert ist der R Wert.
Da sind die beiden Kanäle ineinander verschachtelt...
Das Problem lässt sich zwar in Matlab recht einfach für eine Seite mit
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
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.