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

Bug bei audioread

 

22fuzzi
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 17.05.16
Wohnort: Graz
Version: Octave ;)
     Beitrag Verfasst am: 26.04.2017, 21:13     Titel: Bug bei audioread
  Antworten mit Zitat      
Liebes Forum!

Scheinbar habe ich ein Octave Problem entdeckt - welches mir sehr Kopfzerbrechen bereitet:
der Befehl "audioread" mit der DATATYPE 'native' macht Mist...

Code:
[sigINT,fs]=audioread('Motor_Hochlauf.wav','native');

load Data

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))

save('-mat', 'Data.mat', 'sig_octave', 'sig_matlab')


Bitte die Endung von Motor_Hochlauf in .wav ändern!!! (konnte ich nicht uploaden)

Würde mich über Feedback freuen - jenachdem welches Programm ihr verwendet!
Danke!
j

Motor_Hochlauf.wmv
 Beschreibung:
Bitte die Endung in .wav ändern!!!

Download
 Dateiname:  Motor_Hochlauf.wmv
 Dateigröße:  1.16 MB
 Heruntergeladen:  569 mal
Data.mat
 Beschreibung:

Download
 Dateiname:  Data.mat
 Dateigröße:  2.32 MB
 Heruntergeladen:  575 mal
Private Nachricht senden Benutzer-Profile anzeigen


AndyydnA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2017, 19:08     Titel:
  Antworten mit Zitat      
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.
 
22fuzzi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 17.05.16
Wohnort: Graz
Version: Octave ;)
     Beitrag Verfasst am: 27.04.2017, 19:51     Titel:
  Antworten mit Zitat      
Lieber Andy!

Ja genau, es geht um diese +/- 1!

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

hab nen weiteren Thread aufgemacht:
http://www.gomatlab.de/alternative-zu-audioread-t43599.html

LG j
Private Nachricht senden Benutzer-Profile anzeigen
 
AndyydnA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2017, 15:25     Titel:
  Antworten mit Zitat      
Liebster fuzzy,

wenn du in den Code schaust (UTSL) siehst du in audioread.cc Ab Zeile 123 (sic!)

Code:

  Matrix audio (items, info.channels);
  double *paudio = audio.fortran_vec ();
  data += start * info.channels;
  for (int i = 0; i < items; i++)
    {
      for (int channel = 0; channel < info.channels; channel++)
        paudio[items*channel+i] = *data++;
    }

  octave_value ret_audio;
  if ((nargin == 2 && args(1).is_string ()) || nargin == 3)
    {
      std::string type;
      if (nargin == 3)
        type = args(2).string_value ();
      else
        type = args(1).string_value ();

      if (type == "native")
        {
          switch (info.format & SF_FORMAT_SUBMASK)
            {
            case SF_FORMAT_PCM_S8:
              ret_audio = int8NDArray (audio * 127);
              break;
            case SF_FORMAT_PCM_U8:
              ret_audio = uint8NDArray (audio * 127 + 127);
              break;
            case SF_FORMAT_PCM_16:
              ret_audio = int16NDArray (audio * 32767);
              break;
            case SF_FORMAT_PCM_24:
              ret_audio = int32NDArray (audio * 8388608);
              break;
            case SF_FORMAT_PCM_32:
              ret_audio = int32NDArray (audio * 2147483648);
              break;
 
!

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

Viel Erfolg, Gruß Andy
 
22fuzzi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 17.05.16
Wohnort: Graz
Version: Octave ;)
     Beitrag Verfasst am: 02.05.2017, 15:17     Titel:
  Antworten mit Zitat      
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 -*-


Habe eigentlich alles gelassen nur auf int geändert...
Leider bin ich kein c++ Auskenner...
Bitte um Hilfe / erklärung des Problems! Danke!
mein File:

Code:


#if defined (HAVE_CONFIG_H)
#  include "config.h"
#endif

#include <string>
#include <map>

#include "oct-locbuf.h"
#include "unwind-prot.h"

#include "defun-dld.h"
#include "error.h"
#include "errwarn.h"
#include "ovl.h"
#include "ov.h"
#include "ov-struct.h"
#include "pager.h"

#if defined (HAVE_SNDFILE)
#  include <sndfile.h>
#endif

#if defined (HAVE_SNDFILE)
static void
safe_close (SNDFILE *file)
{
  sf_close (file);
}
#endif

DEFUN_DLD (audioread__JF, args, ,
                      doc: /* -*- texinfo -*-
@deftypefn  {} {[@var{y}, @var{fs}] =} audioread__JF (@var{filename})
@deftypefnx {} {[@var{y}, @var{fs}] =} audioread__JF (@var{filename}, @var{samples})

@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)

  int nargin = args.length ();

  if (nargin < 1 || nargin > 3)
    print_usage ();

  std::string filename = args(0).xstring_value ("audioread__JF: FILENAME must be a string");

  SF_INFO info;
  info.format = 0;
  SNDFILE *file = sf_open (filename.c_str (), SFM_READ, &info);

  if (! file)
    error ("audioread__JF: failed to open input file %s", filename.c_str ());

  octave::unwind_protect frame;

  frame.add_fcn (safe_close, file);

  OCTAVE_LOCAL_BUFFER (int, data, info.frames * info.channels);
 
  sf_read_int (file, data, info.frames * info.channels);

  sf_count_t start = 0;
  sf_count_t end = info.frames;

  if ((nargin == 2 && ! args(1).is_string ()) || nargin == 3)
    {
      RowVector range = args(1).row_vector_value ();

      if (range.numel () != 2)
        error ("audioread__JF: invalid specification for range of frames");

      double dstart = octave::math::isinf (range(0)) ? info.frames : range(0);
      double dend = octave::math::isinf (range(1)) ? info.frames : range(1);

      if (dstart < 1 || dstart > dend || dend > info.frames
          || octave::math::x_nint (dstart) != dstart || octave::math::x_nint (dend) != dend)
        error ("audioread__JF: invalid specification for range of frames");

      start = dstart - 1;
      end = dend;
    }

  sf_count_t items = end - start;

  Matrix audio (items, info.channels);

int *paudio = audio.fortran_vec ();
 
  data += start * info.channels;

  for (int i = 0; i < items; i++)
    {
      for (int channel = 0; channel < info.channels; channel++)
        paudio[items*channel+i] = *data++;
    }

  octave_value ret_audio;
 
    ret_audio = audio;

  return ovl (ret_audio, info.samplerate);

#else

  octave_unused_parameter (args);

  err_disabled_feature ("audioread__JF",
                        "reading and writing sound files through libsndfile");

#endif
}


 
Private Nachricht senden Benutzer-Profile anzeigen
 
AndyydnA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2017, 13:04     Titel:
  Antworten mit Zitat      
So, ich habe mal etwas nach https://github.com/octave-de/macgyv.....master/audioread_int16.cc gelegt.

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

Viel Erfolg
 
22fuzzi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 17.05.16
Wohnort: Graz
Version: Octave ;)
     Beitrag Verfasst am: 29.05.2017, 14:01     Titel:
  Antworten mit Zitat      
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
Code:
signal=signal(1:2:end)
beheben, im C-Code bring ichs leider nicht zusammen... bitte um Hilfe.

Danke im Voraus,
johannes
Private Nachricht senden Benutzer-Profile anzeigen
 
AndyydnA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.05.2017, 10:07     Titel:
  Antworten mit Zitat      
Hallo fuzzi,
da kam so lange keine Antwort, dass ich dachte das würde schon alles funktionieren.

Ich habe die Anordnung der Kanäle mit
https://github.com/octave-de/macgyv.....9757bf7ec1de5f6dd6bd2d67d
gefixed.

Ein "git pull && make" sollte ausreichen

HTH, Andy
 
AndyydnA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2017, 07:10     Titel:
  Antworten mit Zitat      
Bitte, gern geschehen....
 
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.