# Audio processing and 3D Spectrogram - how to optimize on the Raspberry Pi

GROUPS:
 hystrix 1 Vote I have been fairly successful in creating 3D spectrograms of Bat Calls that I have recorded, but I appear to be limited by the available memory in the Raspberry Pi (No more memory available. Mathematica kernel has shut down). My wav files are recorded at 32-bit, 192000Hz, and are typically 1s to 5s in duration. I can just about process a 1 second file, but 5 seconds is impossible.The code I am using is shown below, and it occurs to me that as I am only interested in ultrasound frequencies between say 18000Hz and 96000Hz, there is probably a lot of data that I could throw away to give the Pi an easier ride. My knowledge of Mathematica is extremely limited, so I would be grateful for some help or guidance in how to optimize the sound analysis. I have adapted the code below from what I could find by internet searches. Can I throw away some data? If so, how could I achieve this?Ideally, I would to increase partSize and offset to values of 2500 to give more detail in the plot (see plot example below using these values on a desktop computer). snd = Import[/home/pi/bat.wav"]; sndData=snd[[1,1,1]]; sndSampleRate=snd[[1,2]]; min=Min[Abs[Fourier[sndData]]]; partSize=250; offset=250; spectroGramData=Take[20*Log10[Abs[Fourier[#]]/min],{2,partSize/2//Floor}]&/@Partition[sndData,partSize,offset]; ListPlot3D[spectroGramData[Transpose],ColorFunction->"Rainbow",DataRange->Round[{{0,Length[sndData]/sndSampleRate},{18000,sndSampleRate/2}},0.1],ImageSize->800,BaseStyle->{FontFamily->"Arial",FontWeight->Bold,12}] Many thanks in advance.
3 years ago
4 Replies
 Arnoud Buzing 2 Votes Can you provide a link to your sample sound file (bat.wav)?Depending on what you're trying to do you may be able to split the data up into smaller pieces.Does the Import usually work (not run out of memory)? If so, what does ByteCount[snd] return?Also what do you get for MaxMemoryUsed[] and MemoryInUse[] at various steps along the way? (There seem to be four significant steps in your algorithm: the import, the Fourier[] computation, the spectroGramData computation and the visualization (ListPlot3D).
 hystrix 2 Votes I have placed two sounds files here:https://www.dropbox.com/sh/hby9gzy5ko546vx/AAAY5p2hAR9oNdkRdAE6rmr8abat3.wav is 1 second in duration and bat5.wav is 5 seconds in duration.Import works for both files; it is the List3DPlot where I get the "no more memory available" error (or sometimes the Pi just freezes).This is the output when processing bat5.wav: In[1]:= snd = Import["/home/pi/bat5.wav"]; ByteCount[snd] MaxMemoryUsed[] MemoryInUse[] Out[2]= 7680224 Out[3]= 45122908 Out[4]= 27782692 In[5]:= sndData=snd[[1,1,1]]; In[6]:= sndSampleRate=snd[[1,2]]; In[7]:= min=Min[Abs[Fourier[sndData]]]; MaxMemoryUsed[] MemoryInUse[] Out[8]= 74466116 Out[9]= 28197612 In[10]:= partSize=250; In[11]:= offset=250; In[12]:= spectroGramData=Take[20*Log10[Abs[Fourier[#]]/min],{2,partSize/2//Floor}]&/@Partition[sndData,partSize,offset]; MaxMemoryUsed[] MemoryInUse[] Out[13]= 74466116 Out[14]= 32447044 In[15]:= ListPlot3D[spectroGramData,ColorFunction->"SolarColors",DataRange->Round[{{0,Length[sndData]/sndSampleRate},{18000,sndSampleRate/2}},0.1],ImageSize->800,BaseStyle->{FontFamily->"Arial",FontWeight->Bold,12}, PerformanceGoal -> "Quality"] MaxMemoryUsed[] MemoryInUse[] During evaluation of In[15]:= No more memory available. Mathematica kernel has shut down. Try quitting other applications and then retry. bat3.wav works OK with the partSize and offset values shown. Increasing them causes the Pi to freeze. I will experiment to see how far I can push them.Hope this helps.