<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>Sorry for spamming, but I forgot to address one of your remarks:<br><br>"Energy"
 detector proved to be the best method for my purpose. My recordings are
 of low quality and very noisy. On top of that the signal I am looking 
for, that is a bird call, is of inharmonic nature. The "default" method 
fails to get them from the background. If you have a look at the spectrogram then you will see that it is fairly challenging to see the onsets.<br><br>Lucas<br><br><div><hr id="stopSpelling">From: lukasz.tracewski@outlook.com<br>To: piem@piem.org; aubio-user@aubio.org<br>Date: Tue, 18 Mar 2014 08:46:35 +0100<br>Subject: Re: [aubio-user] Onset detection in Python<br><br>

<style><!--
.ExternalClass .ecxhmmessage P {
padding:0px;
}

.ExternalClass body.ecxhmmessage {
font-size:12pt;
font-family:Calibri;
}

--></style>
<div dir="ltr">Thanks for the prompt answer!<br><br><div>> why would you want to load the entire file in scipy, when you can use<br>> aubio.source? :) it would avoid bloating your memory, and should be much<br>> much faster. besides aubio.source knows how to read much more than wav<br>> files, provided you compile aubio with libav or ExtAudioFileRef.<br><br>I need to do some filtering first (e.g. high-pass filter) before onsets can be detected. It seems more efficient and less prone to artifacts to process whole sample at once than a window at a time. My recordings are short (1 minute), so burden on memory is minimal. <br><br>If I were to follow your advice then after loading a window I would have to first subject it to high-pass filter, then perform onset detection and stack output of the filter to get a complete high-passed sample at the end. To put into code (and following your example):<br><br>out_sample = numpy.array([])<br>while True:<br>     samples, read = s()<br>     highpassed_samples = highpass_filter(samples)<br>     out_sample = numpy.hstack((samples, highpassed_samples)<br>     if onset_detector(samples):<br>         onsets.append(onset_detector.get_last()<br><br>... which is not only twice slower, but also prone to border problems due to discontinuities in sample (I am reading only hop_size at a time).<br><br>On my GDrive you will find two spectrograms that should show I meant by this:<br>https://drive.google.com/folderview?id=0B46Cy3WOKgyJX1dsUng1T0FSUlk&usp=sharing<br>sample_whole.pdf - highpass filter done over whole sample.<br>sample_windowed.pdf - highpass filter done over windowed sample, read on the fly.<br>simple.wav - example of what I am dealing with. It is actually quite clear sample, many are of much lower quality.<br><br>Perhaps I am not doing something right? After all it seems quite common thing to do some pre-processing and filtering before onset detection.<br><br>Thanks for the hint about setting silence level! <br><br>On a side note: the computing time is important since the program will have to process 10000 hours of recordings. It already does a nice job and helps in nature protection, and so is aubio :-).<br><br><br>Cheers,<br>Lucas<br><br>> <br>> > Here is what I have:<br>> > <br>> > <br>> > onset_detector = onset("energy", window_size, hop_size,<br>> > sample_rate) onsets = []<br>> <br>> you will want to use "default", "ernergy" is by far the worst method<br>> of all.<br>> <br>> > windowed_sample = numpy.array_split(sample, numpy.arange(hop_size,<br>> > len(sample), hop_size)) for frame in windowed_sample: if<br>> > onset_detector(frame): onsets.append(onset_detector.get_last())<br>> <br>> that looks correct.<br>> <br>> > So in fact it simulates reading file from a disc, following what is<br>> >  in examples. One of problems I have with this approach is that I<br>> > am always detecting onset at zero. Is there a smarter solution?<br>> <br>> if the file starts with a frame which level is higher than the silence<br>> threshold, that first frame will be marked as an onset.<br>> <br>> so you could try using onset_detector.set_silence(-60) for instance, just<br>> after creating onset_detector. Default value is -70, in dB SPL.<br>> <br>> > Thanks for the great work!<br>> <br>> you're welcome! :)<br>> <br>> Paul<br>> -----BEGIN PGP SIGNATURE-----<br>> Version: GnuPG/MacGPG2 v2.0.18 (Darwin)<br>> Comment: GPGTools - http://gpgtools.org<br>> Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/<br>> <br>> iEYEARECAAYFAlMndBcACgkQkuC958YALL1vBgCgrS4TL3QbsEIewOsavSxaxObB<br>> Ap4AoKhB5qqadVdbCXpMJnOkpF6u+q8w<br>> =9NVU<br>> -----END PGP SIGNATURE-----<br></div>                                     </div>
<br>_______________________________________________
aubio-user mailing list
aubio-user@aubio.org
https://lists.aubio.org/listinfo/aubio-user</div>                                           </div></body>
</html>