[mirtoolbox] Re: Problems with MIRPEAKS and other...

  • From: Olivier Lartillot <Olivier.Lartillot@xxxxxxxxxxxxx>
  • To: mirtoolbox@xxxxxxxxxxxxx
  • Date: Tue, 11 Nov 2008 09:18:09 +0200

Hello,

Giving as input to mirregularity a frame decomposed object like f = mirframes(audio) or s = mirspectrum(f) produces a lot of divide by zero warning (obviously audio = miraudio(myfile.wav)) :

Thanks for the feedback. So mirregularity calculates the irregularity of spectrum, i.e., the degree of variation of the successive peaks of the spectrum. In order to avoid catching spurious peaks, mirpeaks is actually called with the extra option 'Reso' set to 'SemiTone' (removing peaks whose distance to higher peaks is lower than a semitone). It is probably not the best strategy, so if anyone has an idea of strategy that would work in a general case, I would be interested.

I also realize that these particular options (such as 'Reso' in mirpeaks) implicitly set within operators (such as 'mirregularity') should be fully documented, and preferably modifiable when calling the main operator. I will first document these implicit parameters in the Users' Manual of version 1.2, that I am preparing for next week..

Now this particular "divide by zero" that you encountered is due to a minor bug in that 'Res' option set to 'SemiTone' (estimating semi-tone intervals requires the division between frequencies, but the special case f = 0 Hz should be excluded).

The problem should be given by mirpeaks function, but when I call it on the same object, for ex. s, no warning is given. Instead, if I try to visualize the result, Matlab crashes giving the following message.

p = mirpeaks(s); %no error
p %crash

I am not sure to know the reason of this crash but maybe it is a memory problem in the case of long audio files. I cannot reproduce it on my Mac environment, even using long audio files, but maybe I could try with your own file.

Another last question: I wanted to use mirroughness to get some information, but there are some problems. If I pass to it a frame decomposed object like f = mirframe(audio) only one value is returned instead of the different values of roughness along time.

Oops, mirroughness was calling mirframe even if the input is already decomposed into frames, and there was a bug in mirframe: because your input was already decomposed into frames, mirframe returned the first frame only... I am correcting that right away.

Using a simple audio object I read that an automatic frame decomposition is performed, and roughness along time is returned. But what about if I wanted to use a different frame length than 50 ms?

For the moment, you can use the 'Frame' option in mirroughness:
mirroughness('myfile', 'Frame', length, hop). cf. mirframe documentation in Users' Manual 1.1, p. 24.

Best regards,

Olivier

Luca Piccina kirjoitti 8.11.2008 kello 3.46:

Hello,
I am Luca from Italy and I have a problem with the functions mirregularity and mirpeaks. Giving as input to mirregularity a frame decomposed object like f = mirframes(audio) or s = mirspectrum(f) produces a lot of divide by zero warning (obviously audio = miraudio(myfile.wav)) :
Warning: Divide by zero.
  In mirpeaks>main at 461
  In mirfunction at 151
  In mirpeaks at 177
  In mirregularity>init at 45
  In mirfunction at 126
  In mirregularity at 37


The problem should be given by mirpeaks function, but when I call it on the same object, for ex. s, no warning is given. Instead, if I try to visualize the result, Matlab crashes giving the following message.

p = mirpeaks(s); %no error
p %crash
----------------------------------------------------------------------
       Segmentation violation detected at Sat Nov 08 02:27:40 2008
------------------------------------------------------------------------

Configuration:
  MATLAB Version:   7.0.0.19920 (R14)
  Operating System: Microsoft Windows XP
  Window System:    Version 5.1 (Build 2600: Service Pack 2)
  Processor ID:     x86 Family 6 Model 15 Stepping 6, GenuineIntel
Virtual Machine: Java 1.4.2 with Sun Microsystems Inc. Java HotSpot(TM) Client VM
    (mixed mode)
  Default Charset:  ibm-5348_P100-1997

Register State:
  EAX = 00239587  EBX = 0f416630
  ECX = 28600030  EDX = 002399fa
  ESI = 1a5946f0  EDI = 1a686580
  EBP = 00cdc9f4  ESP = 00cdc6a4
  EIP = 791bc242  FLG = 00010287

Stack Trace:
[0] hg.dll:_render_mesh_zbuf(0x1a4acf40, 0x1ae46470, 0x01000001, 0x1a4acf40) + 3746 bytes [1] hg.dll:_GO_RenderZbuffer(0x1a4acf40, 0x1ae46470, 0x1a686580, 0x1a686580) + 25 bytes [2] hg.dll:void __cdecl renderKidsZbufRecursive(struct GObject_tag *,struct RenderBuffer *,struct MaterialProps_tag *,struct NLights_tag *)(0x1a72dc20, 0x1a686580, 0x1a5946c0, 0x1a594690) + 362 bytes [3] hg.dll:void __cdecl renderKidsZbuf(struct GObject_tag *,struct RenderBuffer *)(0x1a686580, 0x1a686580, 0x1a72dc20, 0xb5040f00) + 137 bytes [4] hg.dll:_RenderAxisZbuffer(0x1a72dc20, 0, 0x01686580, 0x1a72dc20) + 145 bytes [5] hg.dll:_GO_RenderZbuffer(0x1a72dc20, 0, 0x1a686580, 0x1a686290) + 25 bytes [6] hg.dll:bool __cdecl RenderNormalAxesChildrenRecursive(struct GObject_tag *,struct RenderBuffer *)(0x1a686290, 0x1a686580, 0x1a686580, 0x1acae370) + 246 bytes [7] hg.dll:void __cdecl RenderFigureZbuffer(struct GObject_tag *,struct XFormedData *,struct RenderBuffer *)(0x1a686290, 0, 0x1a686500, 0x1a686290) + 112 bytes [8] hg.dll:_GO_RenderZbuffer(0x1a686290, 0, 0x1a686580, 0x1a686290) + 25 bytes [9] hg.dll:public: virtual void __thiscall ZBufferRenderEngine::draw(struct GObject_tag *)(0x1a686290, 0x00cdcb58 "°ËÍ", 0x79187849, 0x1ae49bd4) + 128 bytes [10] hg.dll:void __cdecl RenderEngineDraw(struct RenderEngine_tag *,struct GObject_tag *)(0x1ae49bd4, 0x1a686290, 0x0f417730, 0x0f0cbb30 "PÍ\ny") + 22 bytes [11] hg.dll:_figure_expose_fcn(0x0f417730, 0x00cdcb98, 0x0f417730, 0) + 185 bytes [12] libmwgui.dll:void __cdecl wm_ExposeFcn(struct WinRec_tag *) (0x0f417730, 0x0f417730, 0, 0x0f49d110) + 97 bytes [13] libuij.dll:public: static void __cdecl FigureJavaEventManager::PaintCallback(class UDInterface *,void *,void const *,bool)(0x1a345750, 0x1a665010, 0x00cdcc8c, 0) + 208 bytes [14] libuij.dll:public: virtual bool __thiscall uij::JavaEventListener::execute(class UDEvent *)(0x00cdcc8c, 0x0f564ec0, 0x1a345750, 0x00cdcc8c) + 64 bytes [15] udd.dll:public: bool __thiscall UDListenerList::execute(class UDEvent *)(0x00cdcc8c, 0x00cdcc54 "lÌÍ", 0x788d8df9, 0x0ef745a0) + 86 bytes [16] udd.dll:public: virtual void __thiscall UDListenerManagerHost::notifyEvent(class UDDatabaseClient *,class UDEventSource const *,class UDEventInfo const *,class UDEvent *) (0x0ef745a0, 0x1a345754, 0x0f564ec0, 0x00cdcc8c) + 52 bytes [17] udd.dll:public: virtual void __thiscall UDEventInfo::send(class UDDatabaseClient *,class UDInterface *,class UDEvent *)(0x0ef745a0, 0x1a345750, 0x00cdcc8c, 0x1a345750) + 57 bytes [18] udd.dll:public: void __thiscall UDInterface::send(class UDDatabaseClient *,class UDEventInfo *,class UDEvent *)(0x0ef745a0, 0x0f564ec0, 0x00cdcc8c, 0) + 85 bytes [19] udd_mi.dll:_ProcessBeanUDDEvent(291, 0x00cdcd0c, 0, 0x00cdcdf0) + 551 bytes [20] uiw.dll:bool __cdecl UIW_DispatchUserMessage(int,int)(9223, 291, 0, 0x00030000 "Actx ") + 76 bytes [21] uiw.dll:_HandleUserMsgHook@12(0, 1, 0x00cdcdf0, 0x00cdcec4 "ÔÎÍ") + 74 bytes [22] USER32.dll:0x7e3b18e3(0x00030000 "Actx ", 1, 0x00cdcdf0, 0x7905d8b0)
  [23] USER32.dll:0x7e39f7f6(0x00cdcde0, 0x00cdcdf0, 0x00cdce0c, 0)
  [24] USER32.dll:0x7e39f94b(0x00cdcde0, 48, 0x00030000 "Actx ", 1)
  [25] ntdll.dll:0x7c91eae3(0x00cdcec4 "ÔÎÍ", 0, 0, 0)
[26] uiw.dll:void __cdecl ws_ProcessPendingEventsMainLoop(int,bool) (0, 1, 0x00cdcf28 "HÏÍ", 0x79189112) + 378 bytes [27] uiw.dll:void __cdecl ws_ProcessPendingEventsWaitForWindows(int)(0, 0xffffffff, 0, 0x00cdd21c "PÒÍ") + 79 bytes [28] hg.dll:_hgDrawnow(1, 0x00cdd1bc, 0, 0x00cdd21c "PÒÍ") + 130 bytes [29] m_dispatcher.dll:public: virtual void __thiscall Mfh_builtin<struct mxArray_tag>::dispatch_mf(int,struct mxArray_tag * *,int,struct mxArray_tag * *)(0, 0x00cdd1bc, 0, 0x00cdd21c "PÒÍ") + 55 bytes [30] m_dispatcher.dll:public: virtual void __thiscall Mfh_MATLAB_fn::dispatch_fh(int,struct mxArray_tag * *,int,struct mxArray_tag * *)(0, 0x00cdd1bc, 0, 0x00cdd21c "PÒÍ") + 200 bytes [31] m_interpreter.dll:_inDispatchFromStack(172, 0x1a66816c "drawnow", 0, 0) + 891 bytes [32] m_interpreter.dll:enum opcodes __cdecl inDispatchCall(char const *,int,int,int,int *,int *)(0x1a66816c "drawnow", 172, 0, 0) + 111 bytes [33] m_interpreter.dll:int __cdecl inInterp(enum inDebugCheck,int,int,enum opcodes,struct inPcodeNest_tag volatile *) (1, 8238, 407, 0) + 2282 bytes [34] m_interpreter.dll:int __cdecl inInterPcodeSJ(enum inDebugCheck,int,int,enum opcodes,struct inPcodeNest_tag *)(1, 8238, 9, 0) + 272 bytes [35] m_interpreter.dll:int __cdecl inExecuteMFunctionOrScript(class Mfh_mp *,bool)(0x1a681cd0, 0, 13, 13) + 773 bytes [36] m_interpreter.dll:_inWordsj(1, 0x00cdd8dc, 13, 0x00cdd93c) + 441 bytes [37] m_interpreter.dll:public: void __thiscall Mfh_mp::inRunMP(int,struct mxArray_tag * *,int,struct mxArray_tag * *,struct inWorkSpace_tag *)(1, 0x00cdd8dc, 13, 0x00cdd93c) + 158 bytes [38] m_interpreter.dll:public: virtual void __thiscall Mfh_mp::dispatch_file(struct _mdUnknown_workspace *,int,struct mxArray_tag * *,int,struct mxArray_tag * *)(0, 1, 0x00cdd8dc, 13) + 28 bytes [39] m_interpreter.dll:public: virtual void __thiscall Mfh_mp::dispatch_file(int,struct mxArray_tag * *,int,struct mxArray_tag * *)(1, 0x00cdd8dc, 13, 0x00cdd93c) + 26 bytes [40] m_dispatcher.dll:public: virtual void __thiscall Mfh_file::dispatch_fh(int,struct mxArray_tag * *,int,struct mxArray_tag * *)(1, 0x00cdd8dc, 13, 0x00cdd93c) + 273 bytes [41] m_interpreter.dll:_inDispatchFromStack(621, 0x1a6c8dec "displot", 1, 0x01fffff3) + 891 bytes [42] m_interpreter.dll:enum opcodes __cdecl inDispatchCall(char const *,int,int,int,int *,int *)(0x1a6c8dec "displot", 0, 1, 0xfffffff3) + 111 bytes [43] m_interpreter.dll:int __cdecl inInterp(enum inDebugCheck,int,int,enum opcodes,struct inPcodeNest_tag volatile *) (1, 1160, 63, 0) + 2282 bytes [44] m_interpreter.dll:int __cdecl inInterPcodeSJ(enum inDebugCheck,int,int,enum opcodes,struct inPcodeNest_tag *)(1, 1160, 4, 0) + 272 bytes [45] m_interpreter.dll:int __cdecl inExecuteMFunctionOrScript(class Mfh_mp *,bool)(0x1a6c1d00, 0, 2, 1) + 773 bytes [46] m_interpreter.dll:_inWordsj(0, 0x00cddffc, 2, 0x00cde05c) + 441 bytes [47] m_interpreter.dll:public: void __thiscall Mfh_mp::inRunMP(int,struct mxArray_tag * *,int,struct mxArray_tag * *,struct inWorkSpace_tag *)(0, 0x00cddffc, 2, 0x00cde05c) + 158 bytes [48] m_interpreter.dll:public: virtual void __thiscall Mfh_mp::dispatch_file(struct _mdUnknown_workspace *,int,struct mxArray_tag * *,int,struct mxArray_tag * *)(0, 0, 0x00cddffc, 2) + 28 bytes [49] m_interpreter.dll:public: virtual void __thiscall Mfh_mp::dispatch_file(int,struct mxArray_tag * *,int,struct mxArray_tag * *)(0, 0x00cddffc, 2, 0x00cde05c) + 26 bytes [50] m_dispatcher.dll:public: virtual void __thiscall Mfh_file::dispatch_fh(int,struct mxArray_tag * *,int,struct mxArray_tag * *)(0, 0x00cddffc, 2, 0x00cde05c) + 273 bytes [51] m_interpreter.dll:_inDispatchFromStack(620, 0x1a33c580 "mirdisplay", 0, 2) + 891 bytes [52] m_interpreter.dll:enum opcodes __cdecl inDispatchCall(char const *,int,int,int,int *,int *)(0x1a33c580 "mirdisplay", 0, 0, 2) + 111 bytes [53] m_interpreter.dll:int __cdecl inInterp(enum inDebugCheck,int,int,enum opcodes,struct inPcodeNest_tag volatile *) (1, 35, 4, 0) + 2282 bytes [54] m_interpreter.dll:int __cdecl inInterPcodeSJ(enum inDebugCheck,int,int,enum opcodes,struct inPcodeNest_tag *)(1, 35, 4, 0) + 272 bytes [55] m_interpreter.dll:int __cdecl inExecuteMFunctionOrScript(class Mfh_mp *,bool)(0x0eef0580 "D¸¹xF", 0, 1, 1) + 773 bytes [56] m_interpreter.dll:_inWordsj(0, 0x00cde71c, 1, 0x00cde77c) + 441 bytes [57] m_interpreter.dll:public: void __thiscall Mfh_mp::inRunMP(int,struct mxArray_tag * *,int,struct mxArray_tag * *,struct inWorkSpace_tag *)(0, 0x00cde71c, 1, 0x00cde77c) + 158 bytes [58] m_interpreter.dll:public: virtual void __thiscall Mfh_mp::dispatch_file(struct _mdUnknown_workspace *,int,struct mxArray_tag * *,int,struct mxArray_tag * *)(0, 0, 0x00cde71c, 1) + 28 bytes [59] m_interpreter.dll:public: virtual void __thiscall Mfh_mp::dispatch_file(int,struct mxArray_tag * *,int,struct mxArray_tag * *)(0, 0x00cde71c, 1, 0x00cde77c) + 26 bytes [60] m_dispatcher.dll:public: virtual void __thiscall Mfh_file::dispatch_fh(int,struct mxArray_tag * *,int,struct mxArray_tag * *)(0, 0x00cde71c, 1, 0x00cde77c) + 273 bytes [61] m_interpreter.dll:_inDispatchFromStack(70, 0x1a33a1a0 "display", 0, 1) + 891 bytes [62] m_interpreter.dll:enum opcodes __cdecl inDispatchCall(char const *,int,int,int,int *,int *)(0x1a33a1a0 "display", 70, 0, 1) + 111 bytes [63] m_interpreter.dll:int __cdecl inInterp(enum inDebugCheck,int,int,enum opcodes,struct inPcodeNest_tag volatile *) (2, 0, 0, 0) + 2411 bytes [64] m_interpreter.dll:int __cdecl inInterPcodeSJ(enum inDebugCheck,int,int,enum opcodes,struct inPcodeNest_tag *)(2, 0, 0, 0) + 272 bytes [65] m_interpreter.dll:_inInterPcode(2, 0x7876f2d8 "¸òvx °úrx`ûrxÐúrx¸òvxØòvx", 0, 0) + 69 bytes [66] m_interpreter.dll:enum inExecutionStatus __cdecl in_local_call_eval_function(int *,struct _pcodeheader *,int *,struct mxArray_tag * * const,enum inDebugCheck)(0x00cdf2c8, 0x00cdf3bc, 2, 0x1a22b0c0 "p\n") + 162 bytes [67] m_interpreter.dll:$L72592(0x7876f2d8 "¸òvx °úrx`ûrxÐúrx¸òvxØòvx", 0x1a22b0c0 "p\n", 2, 0) + 196 bytes [68] m_interpreter.dll:enum inExecutionStatus __cdecl inEvalCmdWithLocalReturnandtype(char const *,int *,enum inDebugCheck) (0, 2, 1, 0x00cdf44c "ôôÍ") + 86 bytes [69] m_interpreter.dll:_inEvalCmdNoEnd(0x1a22b0c0 "p\n", 0x00cdf4e4, 0x00cdf4a0, 0x014b1f98) + 16 bytes
  [70] bridge.dll:_mnParser(0x7c80b6a1, 0x014b1f98, 0, 0) + 431 bytes
[71] mcr.dll:public: void __thiscall mcrInstance::mnParser(void) (271268, 0x505c3a43, 0x72676f72, 0x696d6d61) + 87 bytes
  [72] MATLAB.exe:0x00401d2f(4194304, 0, 271268, 0x014b1f98)
  [73] MATLAB.exe:0x00403e45(3342384, 3276849, 0x7ffde000, 0x8054a6ed)
  [74] kernel32.dll:0x7c816fd7(0x00403cc0 "jth(U@", 0, 0, 1245343)

Is the function working properly or there are some problems? I am quite sospicious because of all those warnings and of the crash...

Another last question: I wanted to use mirroughness to get some information, but there are some problems. If I pass to it a frame decomposed object like f = mirframe(audio) only one value is returned instead of the different values of roughness along time. Using a simple audio object I read that an automatic frame decomposition is performed, and roughness along time is returned. But what about if I wanted to use a different frame length than 50 ms?
Thanks in advance for the help,
best regards

Luca Piccina

Other related posts: