1
$\begingroup$

I have a number of .wav files in a folder. I want to:

  • Import each file as data,
  • cut each list into a certain number of small lists,
  • export each list as .csv.

The .wav files have a length of approx. 25 s with 48 kHz (approx. 1,400,000 samples).

What's the bottleneck here? The for loops? What would be a faster formulation?

Thanks in advance.

fps = 48000; fullpath = (* "path to folder" *) peaklist = {69373, 194369, 328822, 449814, 578921, 693582, 816820, 954078, 1084577, 1213780}; For[mic = 1, mic <= 82, mic++, sig = Import[fullpath<>"S__"<>StringTake["_"<>ToString[mic],-2<>"_Take01_M24.wav","Data"]//Flatten; For[peak=1, peak<=Length[peaklist], peak++, von=peaklist[[peak]]-4800; bis=von+fps-1; Export[fullpath<>"Cut\\"<>plate<>"_Take"<>ToString[peak]<>"_Mic"<>ToString[mic]<>".csv",sig[[von ;; bis]]]; ]; ]; 

UPDATE

I found the .csv export to be horribly slow. Since I have simple lists I will export them as binaries:

a = RandomReal[1, 48000]; AbsoluteTiming[Export["test.csv", a]] {2.5001, "test.csv"} AbsoluteTiming[ file = "test.bin"; BinaryWrite[file, a, "Real32"] Close[file]; ] {0.0061165, Null} 
$\endgroup$

1 Answer 1

3
$\begingroup$

Not a complete answer, just some thoughts as a way to go ...

First, I would get a list of all Imported files:

files=(Flatten@Import[fullpath <> "S__"<>StringTake["_"<>ToString[mic],-2]<>"_Take01_M24.wav", "Data"] &) /@ Range[82]; 

This is your command Import and your mic changed to Slot going from 1 to 82. Next, cutting ranges:

von=peaklist-4800, bis=von+48000-1, 

no need to compute these inside For loop. And all the exporting can be done in one step, adjust for your needs:

Function[u, MapIndexed[Export[fullpath <> "_" <> ToString[u] <> "_" <> ToString[First[#2]] <> ".csv", #1] &, (files[[u]][[#]] & /@ MapThread[Span, {von, bis}])]] /@ Range[82] 

Here u is a dummy variable (each imported file), for each file we Export cutted parts, cutting ranges are given by MapThread[Span, {von, bis}]. Exported file name consists of fullpath <> _ <> filenumber (u = mic) <> _ <> cuttedpartnumber.

$\endgroup$
1
  • $\begingroup$ Thanks for the reply, I'll dig into it. I have avoided pure functions so far but maybe it's the right time to get more comfortable with them. $\endgroup$ Commented Aug 29, 2019 at 17:14

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.