JK updates

This commit is contained in:
2016-05-01 09:28:18 +01:00
parent 841d1e1472
commit a79fbe8c54
30 changed files with 535 additions and 324 deletions
+68 -3
View File
@@ -277,7 +277,7 @@ In [2]:
</div>
</div>
<p>Load source and target databases for matching...</p>
<div class="nbinput nblast container">
<div class="nbinput container">
<div class="highlight-none"><div class="highlight"><pre>
In [3]:
</pre></div>
@@ -298,6 +298,39 @@ In [3]:
</pre></div>
</div>
</div>
<div class="nboutput nblast container">
<div class="container">
</div>
<div class="container">
<div class="highlight"><pre>
<span class="ansired">---------------------------------------------------------------------------</span>
<span class="ansired">IOError</span> Traceback (most recent call last)
<span class="ansigreen">&lt;ipython-input-3-9c41c481744c&gt;</span> in <span class="ansicyan">&lt;module&gt;</span><span class="ansiblue">()</span>
<span class="ansigreen"> 4</span> config<span class="ansiblue">=</span>matching_config<span class="ansiblue"></span>
<span class="ansigreen"> 5</span> )
<span class="ansigreen">----&gt; 6</span><span class="ansired"> </span>source_database<span class="ansiblue">.</span>load_database<span class="ansiblue">(</span>reanalyse<span class="ansiblue">=</span>True<span class="ansiblue">)</span><span class="ansiblue"></span>
<span class="ansigreen"> 7</span> target_database = AudioDatabase(
<span class="ansigreen"> 8</span> target_dir<span class="ansiblue">,</span><span class="ansiblue"></span>
<span class="ansigreen">/Users/samuelperry/PerryPerrySource/pysource/sppysound/src/sppysound/database.pyc</span> in <span class="ansicyan">load_database</span><span class="ansiblue">(self, reanalyse)</span>
<span class="ansigreen"> 119</span> self<span class="ansiblue">.</span>organize_audio<span class="ansiblue">(</span>subdir_paths<span class="ansiblue">,</span> symlink<span class="ansiblue">=</span>self<span class="ansiblue">.</span>config<span class="ansiblue">.</span>database<span class="ansiblue">[</span><span class="ansiblue">&quot;symlink&quot;</span><span class="ansiblue">]</span><span class="ansiblue">)</span><span class="ansiblue"></span>
<span class="ansigreen"> 120</span> <span class="ansiblue"></span>
<span class="ansigreen">--&gt; 121</span><span class="ansired"> </span>self<span class="ansiblue">.</span>analyse_database<span class="ansiblue">(</span>subdir_paths<span class="ansiblue">,</span> reanalyse<span class="ansiblue">)</span><span class="ansiblue"></span>
<span class="ansigreen"> 122</span> <span class="ansiblue"></span>
<span class="ansigreen"> 123</span> <span class="ansigreen">def</span> analyse_database<span class="ansiblue">(</span>self<span class="ansiblue">,</span> subdir_paths<span class="ansiblue">,</span> reanalyse<span class="ansiblue">)</span><span class="ansiblue">:</span><span class="ansiblue"></span>
<span class="ansigreen">/Users/samuelperry/PerryPerrySource/pysource/sppysound/src/sppysound/database.pyc</span> in <span class="ansicyan">analyse_database</span><span class="ansiblue">(self, subdir_paths, reanalyse)</span>
<span class="ansigreen"> 140</span> <span class="ansiblue">&quot;corrupted HDF5 file.\n Make sure this is the only &quot;</span><span class="ansiblue"></span>
<span class="ansigreen"> 141</span> <span class="ansiblue">&quot;running instance and regenerate HDF5 if &quot;</span><span class="ansiblue"></span>
<span class="ansigreen">--&gt; 142</span><span class="ansired"> &quot;neccesary.&quot;.format(datapath))
</span><span class="ansigreen"> 143</span> self<span class="ansiblue">.</span>analysed_audio <span class="ansiblue">=</span> <span class="ansiblue">[</span><span class="ansiblue">]</span><span class="ansiblue"></span>
<span class="ansigreen"> 144</span> <span class="ansiblue"></span>
<span class="ansired">IOError</span>: Unable to create/append to file: ./ExampleDatabase/data/analysis_data.hdf5
This may be due to another instance of this program running or a corrupted HDF5 file.
Make sure this is the only running instance and regenerate HDF5 if neccesary.
</pre></div></div>
</div>
<p>An output database must also be defined. This is to store matching
results and synthesis results generated later. Note that an analysis
list was not defined for this as it will not be analysed</p>
@@ -328,7 +361,7 @@ perform matching. The rematch argument can be set to discard any
previously found matches from pre-existing HDF5 files, otherwise
previously found matches will cause the program to terminate for their
preservation.</p>
<div class="nbinput nblast container">
<div class="nbinput container">
<div class="highlight-none"><div class="highlight"><pre>
In [6]:
</pre></div>
@@ -344,11 +377,28 @@ In [6]:
</pre></div>
</div>
</div>
<div class="nboutput nblast container">
<div class="container">
</div>
<div class="container">
<div class="highlight"><pre>
<span class="ansired">---------------------------------------------------------------------------</span>
<span class="ansired">NameError</span> Traceback (most recent call last)
<span class="ansigreen">&lt;ipython-input-6-a85bd403c2df&gt;</span> in <span class="ansicyan">&lt;module&gt;</span><span class="ansiblue">()</span>
<span class="ansigreen"> 1</span> matcher = Matcher(
<span class="ansigreen"> 2</span> source_database<span class="ansiblue">,</span><span class="ansiblue"></span>
<span class="ansigreen">----&gt; 3</span><span class="ansired"> </span>target_database<span class="ansiblue">,</span><span class="ansiblue"></span>
<span class="ansigreen"> 4</span> output_db<span class="ansiblue">=</span>output_database<span class="ansiblue">,</span><span class="ansiblue"></span>
<span class="ansigreen"> 5</span> config<span class="ansiblue">=</span>matching_config<span class="ansiblue">,</span><span class="ansiblue"></span>
<span class="ansired">NameError</span>: name &apos;target_database&apos; is not defined
</pre></div></div>
</div>
<p>The matching is then run using the brute force matcher method. Other
methods are not currently available.</p>
<p>Warnings may be produced during this process. These will be silenced in
a future revision but do not affect results.</p>
<div class="nbinput nblast container">
<div class="nbinput container">
<div class="highlight-none"><div class="highlight"><pre>
In [7]:
</pre></div>
@@ -360,6 +410,21 @@ In [7]:
</pre></div>
</div>
</div>
<div class="nboutput nblast container">
<div class="container">
</div>
<div class="container">
<div class="highlight"><pre>
<span class="ansired">---------------------------------------------------------------------------</span>
<span class="ansired">NameError</span> Traceback (most recent call last)
<span class="ansigreen">&lt;ipython-input-7-f0cece17161b&gt;</span> in <span class="ansicyan">&lt;module&gt;</span><span class="ansiblue">()</span>
<span class="ansigreen">----&gt; 1</span><span class="ansired"> matcher.match(
</span><span class="ansigreen"> 2</span> matcher<span class="ansiblue">.</span>kdtree_matcher<span class="ansiblue">,</span><span class="ansiblue"></span>
<span class="ansigreen"> 3</span> )
<span class="ansired">NameError</span>: name &apos;matcher&apos; is not defined
</pre></div></div>
</div>
<p>The output database will now contain a HDF5 file containing matching
data for the two databases. This can be used to synthesize results.</p>
<p>The matching_config file for this demo is:</p>
+32 -42
View File
@@ -880,6 +880,13 @@ a Nan matched to any other value is calculated as the furthest match +
<dt id="database.Synthesizer">
<em class="property">class </em><code class="descclassname">database.</code><code class="descname">Synthesizer</code><span class="sig-paren">(</span><em>database1</em>, <em>database2</em>, <em>*args</em>, <em>**kwargs</em><span class="sig-paren">)</span><a class="reference internal" href="modules/database.html#Synthesizer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#database.Synthesizer" title="Permalink to this definition"></a></dt>
<dd><p>An object used for synthesizing output based on grain matching.</p>
<dl class="method">
<dt id="database.Synthesizer.enforce_intensity">
<code class="descname">enforce_intensity</code><span class="sig-paren">(</span><em>grain</em>, <em>source_sample</em>, <em>source_grain_ind</em>, <em>target_sample</em>, <em>target_grain_ind</em><span class="sig-paren">)</span><a class="headerlink" href="#database.Synthesizer.enforce_intensity" title="Permalink to this definition"></a></dt>
<dd><p>Scales the amplitude of the grain by the difference between it&#8217;s intensity and the intensity of the grain specified.</p>
<p>This method will fail if either AnalysedAudioFile object does not have any intensity analyses.</p>
</dd></dl>
<dl class="method">
<dt id="database.Synthesizer.enforce_pitch">
<code class="descname">enforce_pitch</code><span class="sig-paren">(</span><em>grain</em>, <em>source_sample</em>, <em>source_grain_ind</em>, <em>target_sample</em>, <em>target_grain_ind</em><span class="sig-paren">)</span><a class="headerlink" href="#database.Synthesizer.enforce_pitch" title="Permalink to this definition"></a></dt>
@@ -887,13 +894,6 @@ a Nan matched to any other value is calculated as the furthest match +
<p>This method will fail if either AnalysedAudioFile object does not have an f0 analysis.</p>
</dd></dl>
<dl class="method">
<dt id="database.Synthesizer.enforce_rms">
<code class="descname">enforce_rms</code><span class="sig-paren">(</span><em>grain</em>, <em>source_sample</em>, <em>source_grain_ind</em>, <em>target_sample</em>, <em>target_grain_ind</em><span class="sig-paren">)</span><a class="headerlink" href="#database.Synthesizer.enforce_rms" title="Permalink to this definition"></a></dt>
<dd><p>Scales the amplitude of the grain by the difference between it&#8217;s rms and the rms of the grain specified.</p>
<p>This method will fail if either AnalysedAudioFile object does not have an rms analysis.</p>
</dd></dl>
<dl class="method">
<dt id="database.Synthesizer.swap_databases">
<code class="descname">swap_databases</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#database.Synthesizer.swap_databases" title="Permalink to this definition"></a></dt>
@@ -914,7 +914,7 @@ audio in the output database.</p>
<h2>Analysis Classes<a class="headerlink" href="#analysis-classes" title="Permalink to this headline"></a></h2>
<dl class="class">
<dt id="analysis.Analysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">Analysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>name</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/Analysis.html#Analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.Analysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">Analysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>name</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/Analysis.html#Analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.Analysis" title="Permalink to this definition"></a></dt>
<dd><p>Basic descriptor class to build analyses on.</p>
<p>The Analysis base class works as an interface between child descriptor
objects and the HDF5 storage file. This is designed to seperate descriptor
@@ -965,7 +965,7 @@ file.</p>
<h3>Centroid Analysis Class<a class="headerlink" href="#centroid-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.CentroidAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">CentroidAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/CentroidAnalysis.html#CentroidAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.CentroidAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">CentroidAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/CentroidAnalysis.html#CentroidAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.CentroidAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>Temporal centroid descriptor class for generation of temporal centroid
audio analysis.</p>
<p>This descriptor calculates the temporal centroid for overlapping grains of
@@ -1003,7 +1003,7 @@ save to disk.</p>
<h3>F0 Analysis Class<a class="headerlink" href="#f0-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.F0Analysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">F0Analysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/F0Analysis.html#F0Analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.F0Analysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">F0Analysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/F0Analysis.html#F0Analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.F0Analysis" title="Permalink to this definition"></a></dt>
<dd><p>F0 analysis descriptor class for generation of fundamental frequency
estimation.</p>
<p>This descriptor calculates the fundamental frequency for overlapping grains
@@ -1029,7 +1029,7 @@ analysis.</li>
<dl class="staticmethod">
<dt id="analysis.F0Analysis.create_f0_analysis">
<em class="property">static </em><code class="descname">create_f0_analysis</code><span class="sig-paren">(</span><em>frames</em>, <em>samplerate</em>, <em>window_size=512</em>, <em>overlapFac=0.5</em>, <em>m0=None</em>, <em>M=None</em><span class="sig-paren">)</span><a class="headerlink" href="#analysis.F0Analysis.create_f0_analysis" title="Permalink to this definition"></a></dt>
<em class="property">static </em><code class="descname">create_f0_analysis</code><span class="sig-paren">(</span><em>frames</em>, <em>samplerate</em>, <em>window_size=512</em>, <em>overlapFac=0.5</em>, <em>threshold=0.0</em>, <em>m0=None</em>, <em>M=None</em><span class="sig-paren">)</span><a class="headerlink" href="#analysis.F0Analysis.create_f0_analysis" title="Permalink to this definition"></a></dt>
<dd><p>Generate F0 contour analysis.</p>
<p>Calculate the frequency and harmonic ratio values of windowed segments
of the audio file and save to disk.</p>
@@ -1056,7 +1056,7 @@ size containing frames for these times.</p>
<h3>FFT Analysis Class<a class="headerlink" href="#fft-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.FFTAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">FFTAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/FFTAnalysis.html#FFTAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.FFTAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">FFTAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/FFTAnalysis.html#FFTAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.FFTAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>FFT analysis descriptor class for generation of FFT spectral analysis.</p>
<p>This descriptor calculates the spectral content for overlapping grains
of an AnalysedAudioFile object. A full definition of FFT analysis can be
@@ -1075,7 +1075,7 @@ analysis.</li>
<dl class="method">
<dt id="analysis.FFTAnalysis.create_fft_analysis">
<code class="descname">create_fft_analysis</code><span class="sig-paren">(</span><em>window_size=512</em>, <em>window_overlap=2</em>, <em>window_type='hanning'</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/FFTAnalysis.html#FFTAnalysis.create_fft_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.FFTAnalysis.create_fft_analysis" title="Permalink to this definition"></a></dt>
<code class="descname">create_fft_analysis</code><span class="sig-paren">(</span><em>frames</em>, <em>window_size=512</em>, <em>window_overlap=2</em>, <em>window_type='hanning'</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/FFTAnalysis.html#FFTAnalysis.create_fft_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.FFTAnalysis.create_fft_analysis" title="Permalink to this definition"></a></dt>
<dd><p>Create a spectral analysis for overlapping frames of audio.</p>
</dd></dl>
@@ -1108,7 +1108,7 @@ file.</p>
<h3>Harmonic Ratio Analysis Class<a class="headerlink" href="#harmonic-ratio-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.F0HarmRatioAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">F0HarmRatioAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/F0HarmRatioAnalysis.html#F0HarmRatioAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.F0HarmRatioAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">F0HarmRatioAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/F0HarmRatioAnalysis.html#F0HarmRatioAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.F0HarmRatioAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>The F0 HarmRatio analysis object is a placeholder class to allow access to
the harmonic ratio generated in the f0 analysis. As a result it does not
have it&#8217;s own &#8220;create analysis method as other analyses do. it is designed
@@ -1143,7 +1143,7 @@ size containing frames for these times.</p>
<h3>Kurtosis Analysis Class<a class="headerlink" href="#kurtosis-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.KurtosisAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">KurtosisAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/KurtosisAnalysis.html#KurtosisAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.KurtosisAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">KurtosisAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/KurtosisAnalysis.html#KurtosisAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.KurtosisAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>Kurtosis descriptor class for generation of Kurtosis audio analysis.</p>
<p>This descriptor calculates the temporal kurtosis for overlapping grains of
an AnalysedAudioFile object. A full definition of kurtosis analysis can be found
@@ -1162,7 +1162,7 @@ analysis.</li>
<dl class="staticmethod">
<dt id="analysis.KurtosisAnalysis.create_kurtosis_analysis">
<em class="property">static </em><code class="descname">create_kurtosis_analysis</code><span class="sig-paren">(</span><em>frames</em>, <em>variance</em>, <em>window_size=512</em>, <em>overlapFac=0.5</em><span class="sig-paren">)</span><a class="headerlink" href="#analysis.KurtosisAnalysis.create_kurtosis_analysis" title="Permalink to this definition"></a></dt>
<em class="property">static </em><code class="descname">create_kurtosis_analysis</code><span class="sig-paren">(</span><em>frames</em>, <em>variance</em>, <em>window_size=512</em>, <em>window=&lt;function hann&gt;</em>, <em>overlapFac=0.5</em><span class="sig-paren">)</span><a class="headerlink" href="#analysis.KurtosisAnalysis.create_kurtosis_analysis" title="Permalink to this definition"></a></dt>
<dd><p>Calculate the Kurtosis values of windowed segments of the audio file and
save to disk.</p>
</dd></dl>
@@ -1180,7 +1180,7 @@ save to disk.</p>
<h3>Peak Analysis Class<a class="headerlink" href="#peak-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.PeakAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">PeakAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/PeakAnalysis.html#PeakAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.PeakAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">PeakAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/PeakAnalysis.html#PeakAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.PeakAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>Peak descriptor class for generation of per-grain maximum peak audio analysis.</p>
<p>This descriptor calculates the maximum peak for overlapping grains of an
AnalysedAudioFile object. A full definition of peak analysis can be found in
@@ -1217,7 +1217,7 @@ save to disk.</p>
<h3>RMS Analysis Class<a class="headerlink" href="#rms-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.RMSAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">RMSAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/RMSAnalysis.html#RMSAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.RMSAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">RMSAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/RMSAnalysis.html#RMSAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.RMSAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>RMS descriptor class for generation of RMS audio analysis.</p>
<p>This descriptor calculates the Root Mean Square analysis for overlapping
grains of an AnalysedAudioFile object. A full definition of RMS analysis
@@ -1236,7 +1236,7 @@ analysis.</li>
<dl class="staticmethod">
<dt id="analysis.RMSAnalysis.create_rms_analysis">
<em class="property">static </em><code class="descname">create_rms_analysis</code><span class="sig-paren">(</span><em>frames</em>, <em>samplerate</em>, <em>window_size=512</em>, <em>window=&lt;function triang&gt;</em>, <em>overlapFac=0.5</em><span class="sig-paren">)</span><a class="headerlink" href="#analysis.RMSAnalysis.create_rms_analysis" title="Permalink to this definition"></a></dt>
<em class="property">static </em><code class="descname">create_rms_analysis</code><span class="sig-paren">(</span><em>frames</em>, <em>samplerate</em>, <em>window_size=512</em>, <em>window=&lt;function hann&gt;</em>, <em>overlapFac=0.5</em><span class="sig-paren">)</span><a class="headerlink" href="#analysis.RMSAnalysis.create_rms_analysis" title="Permalink to this definition"></a></dt>
<dd><p>Generate RMS contour analysis.</p>
<p>Calculate the RMS values of windowed segments of the audio file and
save to disk.</p>
@@ -1255,7 +1255,7 @@ save to disk.</p>
<h3>Spectral Centroid Analysis Class<a class="headerlink" href="#spectral-centroid-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.SpectralCentroidAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">SpectralCentroidAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralCentroidAnalysis.html#SpectralCentroidAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralCentroidAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">SpectralCentroidAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralCentroidAnalysis.html#SpectralCentroidAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralCentroidAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>Spectral centroid descriptor class for generation of spectral centroid
audio analysis.</p>
<p>This descriptor calculates the spectral centroid for overlapping grains of
@@ -1275,10 +1275,9 @@ analysis.</li>
<dl class="staticmethod">
<dt id="analysis.SpectralCentroidAnalysis.create_spccntr_analysis">
<em class="property">static </em><code class="descname">create_spccntr_analysis</code><span class="sig-paren">(</span><em>fft</em>, <em>length</em>, <em>samplerate</em>, <em>output_format='freq'</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralCentroidAnalysis.html#SpectralCentroidAnalysis.create_spccntr_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralCentroidAnalysis.create_spccntr_analysis" title="Permalink to this definition"></a></dt>
<em class="property">static </em><code class="descname">create_spccntr_analysis</code><span class="sig-paren">(</span><em>fft</em>, <em>samplerate</em>, <em>output_format='ind'</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralCentroidAnalysis.html#SpectralCentroidAnalysis.create_spccntr_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralCentroidAnalysis.create_spccntr_analysis" title="Permalink to this definition"></a></dt>
<dd><p>Calculate the spectral centroid of the fft frames.</p>
<p>length: the length of the window used to calculate the FFT.
samplerate: the samplerate of the audio analysed.
<p>samplerate: the samplerate of the audio analysed.
output_format = Choose either &#8220;freq&#8221; for output in Hz or &#8220;ind&#8221; for bin
index output</p>
</dd></dl>
@@ -1296,7 +1295,7 @@ index output</p>
<h3>Spectral Crest Factor Analysis Class<a class="headerlink" href="#spectral-crest-factor-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.SpectralCrestFactorAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">SpectralCrestFactorAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralCrestFactorAnalysis.html#SpectralCrestFactorAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralCrestFactorAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">SpectralCrestFactorAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralCrestFactorAnalysis.html#SpectralCrestFactorAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralCrestFactorAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>Spectral crest factor descriptor class for generation of spectral crest
factor audio analysis.</p>
<p>This descriptor calculates the spectral crest factor for overlapping grains
@@ -1316,12 +1315,8 @@ analysis.</li>
<dl class="staticmethod">
<dt id="analysis.SpectralCrestFactorAnalysis.create_spccf_analysis">
<em class="property">static </em><code class="descname">create_spccf_analysis</code><span class="sig-paren">(</span><em>fft</em>, <em>length</em>, <em>samplerate</em>, <em>output_format='freq'</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralCrestFactorAnalysis.html#SpectralCrestFactorAnalysis.create_spccf_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralCrestFactorAnalysis.create_spccf_analysis" title="Permalink to this definition"></a></dt>
<em class="property">static </em><code class="descname">create_spccf_analysis</code><span class="sig-paren">(</span><em>fft</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralCrestFactorAnalysis.html#SpectralCrestFactorAnalysis.create_spccf_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralCrestFactorAnalysis.create_spccf_analysis" title="Permalink to this definition"></a></dt>
<dd><p>Calculate the spectral crest factor of the fft frames.</p>
<p>length: the length of the window used to calculate the FFT.
samplerate: the samplerate of the audio analysed.
output_format = Choose either &#8220;freq&#8221; for output in Hz or &#8220;ind&#8221; for bin
index output</p>
</dd></dl>
<dl class="method">
@@ -1349,7 +1344,7 @@ index output</p>
<h3>Spectral Flatness Analysis Class<a class="headerlink" href="#spectral-flatness-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.SpectralFlatnessAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">SpectralFlatnessAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralFlatnessAnalysis.html#SpectralFlatnessAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralFlatnessAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">SpectralFlatnessAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralFlatnessAnalysis.html#SpectralFlatnessAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralFlatnessAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>Spectral flatness descriptor class for generation of spectral flatness
audio analysis.</p>
<p>This descriptor calculates the spectral flatness for overlapping grains of
@@ -1369,12 +1364,8 @@ analysis.</li>
<dl class="staticmethod">
<dt id="analysis.SpectralFlatnessAnalysis.create_spcflatness_analysis">
<em class="property">static </em><code class="descname">create_spcflatness_analysis</code><span class="sig-paren">(</span><em>fft</em>, <em>length</em>, <em>samplerate</em>, <em>output_format='freq'</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralFlatnessAnalysis.html#SpectralFlatnessAnalysis.create_spcflatness_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralFlatnessAnalysis.create_spcflatness_analysis" title="Permalink to this definition"></a></dt>
<em class="property">static </em><code class="descname">create_spcflatness_analysis</code><span class="sig-paren">(</span><em>fft</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralFlatnessAnalysis.html#SpectralFlatnessAnalysis.create_spcflatness_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralFlatnessAnalysis.create_spcflatness_analysis" title="Permalink to this definition"></a></dt>
<dd><p>Calculate the spectral flatness of the fft frames.</p>
<p>length: the length of the window used to calculate the FFT.
samplerate: the samplerate of the audio analysed.
output_format = Choose either &#8220;freq&#8221; for output in Hz or &#8220;ind&#8221; for bin
index output</p>
</dd></dl>
<dl class="method">
@@ -1402,7 +1393,7 @@ index output</p>
<h3>Spectral Flux Analysis Class<a class="headerlink" href="#spectral-flux-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.SpectralFluxAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">SpectralFluxAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralFluxAnalysis.html#SpectralFluxAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralFluxAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">SpectralFluxAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralFluxAnalysis.html#SpectralFluxAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralFluxAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>Spectral flux descriptor class for generation of spectral flux audio
analysis.</p>
<p>This descriptor calculates the spectral flux for overlapping grains of an
@@ -1422,10 +1413,9 @@ analysis.</li>
<dl class="staticmethod">
<dt id="analysis.SpectralFluxAnalysis.create_spcflux_analysis">
<em class="property">static </em><code class="descname">create_spcflux_analysis</code><span class="sig-paren">(</span><em>fft</em>, <em>length</em>, <em>samplerate</em>, <em>output_format='freq'</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralFluxAnalysis.html#SpectralFluxAnalysis.create_spcflux_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralFluxAnalysis.create_spcflux_analysis" title="Permalink to this definition"></a></dt>
<em class="property">static </em><code class="descname">create_spcflux_analysis</code><span class="sig-paren">(</span><em>fft</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralFluxAnalysis.html#SpectralFluxAnalysis.create_spcflux_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralFluxAnalysis.create_spcflux_analysis" title="Permalink to this definition"></a></dt>
<dd><p>Calculate the spectral flux of the fft frames.</p>
<p>length: the length of the window used to calculate the FFT.
samplerate: the samplerate of the audio analysed.
output_format = Choose either &#8220;freq&#8221; for output in Hz or &#8220;ind&#8221; for bin
index output</p>
</dd></dl>
@@ -1455,7 +1445,7 @@ index output</p>
<h3>Spectral Spread Analysis Class<a class="headerlink" href="#spectral-spread-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.SpectralSpreadAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">SpectralSpreadAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralSpreadAnalysis.html#SpectralSpreadAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralSpreadAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">SpectralSpreadAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralSpreadAnalysis.html#SpectralSpreadAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralSpreadAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>Spectral spread descriptor class for generation of spectral spread audio
analysis.</p>
<p>This descriptor calculates the spectral spread for overlapping grains of an
@@ -1475,7 +1465,7 @@ analysis.</li>
<dl class="staticmethod">
<dt id="analysis.SpectralSpreadAnalysis.create_spcsprd_analysis">
<em class="property">static </em><code class="descname">create_spcsprd_analysis</code><span class="sig-paren">(</span><em>fft</em>, <em>spectral_centroid</em>, <em>length</em>, <em>samplerate</em>, <em>output_format='freq'</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralSpreadAnalysis.html#SpectralSpreadAnalysis.create_spcsprd_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralSpreadAnalysis.create_spcsprd_analysis" title="Permalink to this definition"></a></dt>
<em class="property">static </em><code class="descname">create_spcsprd_analysis</code><span class="sig-paren">(</span><em>fft</em>, <em>spectral_centroid</em>, <em>samplerate</em>, <em>output_format='ind'</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/SpectralSpreadAnalysis.html#SpectralSpreadAnalysis.create_spcsprd_analysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.SpectralSpreadAnalysis.create_spcsprd_analysis" title="Permalink to this definition"></a></dt>
<dd><p>Calculate the spectral spread of the fft frames.</p>
<p>fft: Real fft frames.
spectral_centroid: spectral centroid frames (in index format).
@@ -1508,7 +1498,7 @@ samplerate: the samplerate of the audio analysed.</p>
<h3>Variance Analysis Class<a class="headerlink" href="#variance-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.VarianceAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">VarianceAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/VarianceAnalysis.html#VarianceAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.VarianceAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">VarianceAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/VarianceAnalysis.html#VarianceAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.VarianceAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>Variance descriptor class for generation of variance audio analysis.</p>
<p>This descriptor calculates the Root Mean Square analysis for overlapping
grains of an AnalysedAudioFile object. A full definition of variance
@@ -1546,7 +1536,7 @@ save to disk.</p>
<h3>Zero-Crossing Analysis Class<a class="headerlink" href="#zero-crossing-analysis-class" title="Permalink to this headline"></a></h3>
<dl class="class">
<dt id="analysis.ZeroXAnalysis">
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">ZeroXAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/ZeroXAnalysis.html#ZeroXAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.ZeroXAnalysis" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="descclassname">analysis.</code><code class="descname">ZeroXAnalysis</code><span class="sig-paren">(</span><em>AnalysedAudioFile</em>, <em>frames</em>, <em>analysis_group</em>, <em>config=None</em><span class="sig-paren">)</span><a class="reference internal" href="modules/analysis/ZeroXAnalysis.html#ZeroXAnalysis"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#analysis.ZeroXAnalysis" title="Permalink to this definition"></a></dt>
<dd><p>Zero-corssing descriptor class for generation of zero-crossing rate
analysis.</p>
<p>This descriptor calculates the zero-crossing rate for overlapping grains of
+34 -33
View File
@@ -279,7 +279,7 @@ descriptors would match audio based on it&#8217;s pitch and energy.</p>
used to determine the central point of a signal&#8217;s amplitude and is calculated
as:</p>
<div class="math">
\[C(n) = \frac{\sum_{i=i_s(n)}^{i_e(n)}(i-i_s(n)) \cdot x(i)}{\sum_{i=i_s(n)}^{i_e(n)} \cdot x(n)}\]</div>
\[C(n) = \frac{\sum_{i=i_s(n)}^{i_e(n)}(i-i_s(n)) \cdot x(i)}{\sum_{i=i_s(n)}^{i_e(n)} \cdot x(n)}.\]</div>
<p>Ref: <a class="reference internal" href="#lerch2012itaca" id="id1">[Ler12]</a></p>
</div>
<div class="section" id="f0-pitch-detection">
@@ -294,18 +294,18 @@ reasonable versatility for a wide range of signals.</p>
defined as:</p>
<div class="math">
\[R_n(m) = \sum_{i=i_s(n)}^{i_e(n)} x(i) x(i-m)\]</div>
<p>Then normalizing:</p>
<p>then normalizing:</p>
<div class="math">
\[\Gamma_n(m) = \frac{R_n(m)}{\sqrt{\sum_{i=i_s(n)}^{i_e(n)}x(i)^2 \sum_{i=i_s(n)}^{i_e(n)}x(i-m)^2}}\]</div>
\[\Gamma_n(m) = \frac{R_n(m)}{\sqrt{\sum_{i=i_s(n)}^{i_e(n)}x(i)^2 \sum_{i=i_s(n)}^{i_e(n)}x(i-m)^2}}.\]</div>
<p>The fundamental period of the signal is then calculated as the point between
<span class="math">\(T_{min}\)</span> and <span class="math">\(T_{max}\)</span> at which the correlated signal most closely matches the
original. <span class="math">\(T_{min}\)</span> and <span class="math">\(T_{max}\)</span> are defined as the minimum and maximum values of
the fundamental period.</p>
<div class="math">
\[y = arg\,max_{T_{min} \leq m \leq T_{max}} \{\Gamma_i(m)\}\]</div>
\[y = arg\,max_{T_{min} \leq m \leq T_{max}} \{\Gamma_i(m)\}.\]</div>
<p>In order to improve the accuracy of peak detection, parabolic interpolation is
used to estimate the peak&#8217;s location with greater accuracy by using the peak
correlation and it&#8217;s two closes neighbour&#8217;s values to estimate the fractional
correlation and it&#8217;s two closest neighbour&#8217;s values to estimate the fractional
peak value.</p>
<p>The method for parabolic interpolation is defined as:</p>
<div class="math">
@@ -316,7 +316,7 @@ peak value.</p>
<p>Ref: <a class="reference internal" href="#smith2011sasp" id="id2">[Smi16]</a></p>
<p>From this, the fundamental period the frequency is then calculated as:</p>
<div class="math">
\[f_0^n = \frac{1}{T_0^n}\]</div>
\[f_0^n = \frac{1}{T_0^n}.\]</div>
<p>Ref: <a class="reference internal" href="#itaa2014" id="id3">[GP14]</a></p>
</div>
<div class="section" id="fft">
@@ -326,22 +326,22 @@ Fourier Transform for windows of a signal. The full description of this
transform is outside the scope of this project, however it should be understood
that this analysis provides a description of the spectral content of a windowed
signal. By applying the transform, a number of bins of size <span class="math">\(K\)</span> are
calculated that detail the sine and cosine apmlitudes required to reconstruct
calculated that detail the sine and cosine amplitudes required to reconstruct
the signal. The calculation of the STFT is defined as:</p>
<div class="math">
\[X(k,n) = \sum_{i=i_s(n)}^{i_e(n)} x(i) \exp{\Big(-jk \cdot (i -
i_s(n))\frac{2\pi}{K}\Big)}\]</div>
i_s(n))\frac{2\pi}{K}\Big)}.\]</div>
<p>Ref: <a class="reference internal" href="#lerch2012itaca" id="id4">[Ler12]</a></p>
</div>
<div class="section" id="harmonic-ratio">
<h2>Harmonic Ratio<a class="headerlink" href="#harmonic-ratio" title="Permalink to this headline"></a></h2>
<p>The harmonic ratio can be used to differentiate between noisy and periodic
signals. higher values suggest that the signal is more periodic (such as a sine
signals. Higher values suggest that the signal is more periodic (such as a sine
wave) and lower values represent less periodicity. This can be used as a form
of confidence measure in determining the validity of F0 values. it is
of confidence measure in determining the validity of F0 values. It is
calculated as part of the F0 estimation algorithm as:</p>
<div class="math">
\[HR(n) = max_{T_{min} \leq m \leq T_{max}}{\{T_n(m)\}}\]</div>
\[HR(n) = max_{T_{min} \leq m \leq T_{max}}{\{T_n(m)\}}.\]</div>
<p>Ref: <a class="reference internal" href="#lerch2012itaca" id="id5">[Ler12]</a></p>
</div>
<div class="section" id="kurtosis">
@@ -350,23 +350,24 @@ calculated as part of the F0 estimation algorithm as:</p>
values indicate a flatter distribution and positive values indicate a more
&#8220;peaky&#8221; distribution. Kurtosis is calculated as:</p>
<div class="math">
\[TK(n)=\frac{1}{\sigma_x^4(n) \cdot K}\sum_{i=i_s(n)}^{i_e(n)}\Big(x(i)-\mu_x(n)\Big)^4-3\]</div>
\[TK(n)=\frac{1}{\sigma_x^4(n) \cdot K}\sum_{i=i_s(n)}^{i_e(n)}\Big(x(i)-\mu_x(n)\Big)^4-3.\]</div>
<p>Ref: <a class="reference internal" href="#lerch2012itaca" id="id6">[Ler12]</a></p>
</div>
<div class="section" id="peak-amplitude">
<h2>Peak Amplitude<a class="headerlink" href="#peak-amplitude" title="Permalink to this headline"></a></h2>
<p>Peak amplitude measures the highest peak in the absoulte signal. it is
<p>Peak amplitude measures the highest peak in the absolute signal. It is
calculated as:</p>
<div class="math">
\[P(n) = \max_{i_s(n) \leq i \leq i_e(n)}\{\left|x(i)\right|\}\]</div>
\[P(n) = \max_{i_s(n) \leq i \leq i_e(n)}\{\left|x(i)\right|\}.\]</div>
</div>
<div class="section" id="rms">
<h2>RMS<a class="headerlink" href="#rms" title="Permalink to this headline"></a></h2>
<p>The perceived loudness of a signal is an important feature as it can be related
to the dynamics of the signal. RMS is used as a measure of sound intensity and
is used for distinguishing between loud and quiet audio. It is calculated as:</p>
is used for distinguishing between loud and quiet audio. It is calculated as,
where $K$ is the total number of samples:</p>
<div class="math">
\[RMS(n) = \sqrt{\frac{1}{K} \sum_{i=i_s(n)}^{i_e(n)} x(i)^2}\]</div>
\[RMS(n) = \sqrt{\frac{1}{K} \sum_{i=i_s(n)}^{i_e(n)} x(i)^2}.\]</div>
<p>Other methods that take the human perception of loudness into account may
provide more perceptually relevant results. However the RMS measurement
produced acceptable results for this application.</p>
@@ -374,25 +375,25 @@ produced acceptable results for this application.</p>
</div>
<div class="section" id="spectral-centroid">
<h2>Spectral Centroid<a class="headerlink" href="#spectral-centroid" title="Permalink to this headline"></a></h2>
<p>The spectral centroid measure the center of gravity accross frequency bins to
determine the central point accross the spectral content of the frame. High
value sindicate that the spectral content is centered in higher frequencies and
lower value indicate a lower center. The spectral centroid is calculated as:</p>
<p>The spectral centroid measure the centre of gravity across frequency bins to
determine the central point across the spectral content of the frame. High
values indicate that the spectral content is centred in higher frequencies and
lower value indicate a lower centre. The spectral centroid is calculated as:</p>
<div class="math">
\[SC(n) = \frac{\sum_{k=0}^{K/2-1} k \cdot | X(k,n) | ^2}{\sum_{k=0}^{K/2-1} | X(k,n) | ^2}\]</div>
\[SC(n) = \frac{\sum_{k=0}^{K/2-1} k \cdot | X(k,n) | ^2}{\sum_{k=0}^{K/2-1} | X(k,n) | ^2}.\]</div>
<p>The result is the sum of magnitudes, weighted by their index, normalized by the
unweighted sum.</p>
<p>Ref: <a class="reference internal" href="#lerch2012itaca" id="id8">[Ler12]</a></p>
</div>
<div class="section" id="spectral-crest-factor">
<h2>Spectral Crest Factor<a class="headerlink" href="#spectral-crest-factor" title="Permalink to this headline"></a></h2>
<p>The spectral crest factor can be used as a mesure of tonalness of the signal.
it is calculated by taking the maximum magnitude and dividing by the sum of
<p>The spectral crest factor can be used as a measure of tonalness of the signal.
It is calculated by taking the maximum magnitude and dividing by the sum of
magnitudes.
This differntiates between flat spectrums and sinusoidal spectrums. (low values
represnting the former and high values representing the latter.)</p>
This differentiates between flat spectrums and sinusoidal spectrums. (low values
representing the former and high values representing the latter.)</p>
<div class="math">
\[SCF = \frac{ \max_{0 \leq k \leq K/2-1} \{| X(k,n) | \}}{\sum_{k=0}^{K/2-1} | X(k,n) | }\]</div>
\[SCF = \frac{ \max_{0 \leq k \leq K/2-1} \{| X(k,n) | \}}{\sum_{k=0}^{K/2-1} | X(k,n) | }.\]</div>
<p>Ref: <a class="reference internal" href="#lerch2012itaca" id="id9">[Ler12]</a></p>
</div>
<div class="section" id="spectral-flatness">
@@ -403,7 +404,7 @@ indicate a flatter spectrum (suggesting a noisy signal) as opposed to lower
values that represent a more tonal signal. Spectral flatness is calculated as:</p>
<div class="math">
\[TFl(n) = \frac{\sqrt[K/2]{\prod_{k=0}^{K/2-1} | X(k,n) | }}{2/K \cdot
\sum_{k=0}^{K/2-1} | X(k,n) | }\]</div>
\sum_{k=0}^{K/2-1} | X(k,n) | }.\]</div>
<p>Ref: <a class="reference internal" href="#lerch2012itaca" id="id10">[Ler12]</a></p>
</div>
<div class="section" id="spectral-flux">
@@ -411,10 +412,10 @@ values that represent a more tonal signal. Spectral flatness is calculated as:</
<p>Spectral flux is a measure of change between consecutive frames. It calculates
the average difference between frames to differentiate between adjacent frames
that are largely dissimilar (suggesting a non-stationary section of signal) and
similiar frames (that suggests a steady state signal). It is calculated as:</p>
similar frames (that suggests a steady state signal). It is calculated as:</p>
<div class="math">
\[SF(n) = \frac{\sqrt{\sum_{k=0}^{K/2-1} \Big( | X(k,n) | - | X(k,n-1) | \Big)^2
}}{K/2}\]</div>
}}{K/2}.\]</div>
<p>Ref: <a class="reference internal" href="#lerch2012itaca" id="id11">[Ler12]</a></p>
</div>
<div class="section" id="spectral-spread">
@@ -424,7 +425,7 @@ spectral centroid. This description relates to the spectral shape of the signal
and is associated with perceptions of timbre. It is calculated as:</p>
<div class="math">
\[SS(n) = \sqrt{\frac{\sum_{k=0}^{K/2-1} \Big(k-SC(n)\Big)^2 \cdot | X(k,n)
| ^2}{\sum_{k=0}^{K/2-1} | X(k,n) | ^2}}\]</div>
| ^2}{\sum_{k=0}^{K/2-1} | X(k,n) | ^2}}.\]</div>
<p>Ref: <a class="reference internal" href="#lerch2012itaca" id="id12">[Ler12]</a></p>
</div>
<div class="section" id="variance">
@@ -432,14 +433,14 @@ and is associated with perceptions of timbre. It is calculated as:</p>
<p>The variance of a signal measures it&#8217;s spread around the signal&#8217;s arithmetic
mean. It is used in the calculation of Kurtosis and is calculated as:</p>
<div class="math">
\[\sigma_x^2 = \frac{1}{K} \sum_{i=i_s(n)}^{i_e(n)}(x(i) - \mu_x(n))^2\]</div>
\[\sigma_x^2 = \frac{1}{K} \sum_{i=i_s(n)}^{i_e(n)}(x(i) - \mu_x(n))^2.\]</div>
<p>Ref: <a class="reference internal" href="#lerch2012itaca" id="id13">[Ler12]</a></p>
</div>
<div class="section" id="zero-crossing">
<h2>Zero-Crossing<a class="headerlink" href="#zero-crossing" title="Permalink to this headline"></a></h2>
<p>The zero-crossing rate counts the number of times a signal&#8217;s value changes from
positive to negative in a frame. it is relevant to determining the noisiness of
a signal, as noisy signals will pass from positive to negative more frequenctly
positive to negative in a frame. It is relevant to determining the noisiness of
a signal, as noisy signals will pass from positive to negative more frequently
than period signals. It is calculated as:</p>
<div class="math">
\[Z(n) = \frac{1}{2K} \sum_{i=i_s(n)}^{i_e(n)} | sgn[x(i)] - sgn[x(i-1)] |\]\[\text{Where the sgn function is defined as:}\]\[\begin{split}sgn[x_i(n)] = \left\{
+2 -2
View File
@@ -392,13 +392,13 @@
</dt>
<dt><a href="api.html#database.Synthesizer.enforce_pitch">enforce_pitch() (database.Synthesizer method)</a>
<dt><a href="api.html#database.Synthesizer.enforce_intensity">enforce_intensity() (database.Synthesizer method)</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="api.html#database.Synthesizer.enforce_rms">enforce_rms() (database.Synthesizer method)</a>
<dt><a href="api.html#database.Synthesizer.enforce_pitch">enforce_pitch() (database.Synthesizer method)</a>
</dt>
+16 -8
View File
@@ -263,7 +263,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> through the currently implemented descriptors.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="c"># Create object logger</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span> <span class="o">+</span> <span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store AnalysedAudioFile object to be analysed.</span>
@@ -297,12 +297,12 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># be saved in the HDF5 file</span>
<span class="n">data_dict</span><span class="p">,</span> <span class="n">attrs_dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hdf5_dataset_formatter</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">create_dataset</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">create_dataset</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">chunks</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">attrs_dict</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">attrs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Analysis already exists. Reading from: &quot;</span>
<span class="s">&quot;{0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
@@ -311,7 +311,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># be saved in the HDF5 file</span>
<span class="n">data_dict</span><span class="p">,</span> <span class="n">attrs_dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hdf5_dataset_formatter</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">create_dataset</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">create_dataset</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">chunks</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">attrs_dict</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">attrs</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
@@ -327,6 +327,12 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">vtimes</span> <span class="o">=</span> <span class="n">times</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">selection</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">transpose</span><span class="p">((</span><span class="n">vtimes</span> <span class="o">&gt;=</span> <span class="n">start</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">vtimes</span> <span class="o">&lt;=</span> <span class="n">end</span><span class="p">))</span>
<span class="c"># If there are no frames for this grain, take the two closest frames</span>
<span class="c"># from the adjacent grains.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">selection</span><span class="o">.</span><span class="n">any</span><span class="p">():</span>
<span class="n">frame_center</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="p">(</span><span class="n">end</span><span class="o">-</span><span class="n">start</span><span class="p">)</span><span class="o">/</span><span class="mf">2.</span>
<span class="n">closest_frames</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">vtimes</span><span class="o">-</span><span class="n">frame_center</span><span class="p">)</span><span class="o">.</span><span class="n">argsort</span><span class="p">()[:</span><span class="mi">2</span><span class="p">]</span>
<span class="n">selection</span><span class="p">[</span><span class="n">closest_frames</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
<span class="c">#start_ind = np.min(selection)</span>
<span class="c">#end_ind = np.argmax(selection)</span>
@@ -354,20 +360,19 @@ div.nboutput > :nth-child(2).stderr {
<span class="c">################################################################################</span>
<span class="k">def</span> <span class="nf">log2_median</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">log2</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">median</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">median</span><span class="p">(</span><span class="mi">1000</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">log2</span><span class="p">(</span><span class="mi">1</span><span class="o">+</span><span class="n">x</span><span class="o">/</span><span class="mi">1000</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">log2_mean</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">log2</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="mi">1000</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">log2</span><span class="p">(</span><span class="mi">1</span><span class="o">+</span><span class="n">x</span><span class="o">/</span><span class="mi">1000</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">formatter_func</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">selection</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">valid_inds</span><span class="p">,</span> <span class="n">formatter</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="c"># get all valid frames from current grain</span>
<span class="n">frames</span> <span class="o">=</span> <span class="n">frames</span><span class="p">[</span><span class="n">selection</span> <span class="o">&amp;</span> <span class="n">valid_inds</span><span class="p">]</span>
<span class="k">return</span> <span class="n">formatter</span><span class="p">(</span><span class="n">frames</span><span class="p">)</span>
<span class="c">#if less than half the frames are valid then the grain is not valid.</span>
<span class="k">if</span> <span class="n">frames</span><span class="o">.</span><span class="n">size</span> <span class="o">&lt;</span> <span class="n">valid_inds</span><span class="p">[</span><span class="n">selection</span><span class="p">]</span><span class="o">.</span><span class="n">nonzero</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">size</span><span class="o">/</span><span class="mi">2</span><span class="p">:</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">formatter</span><span class="p">(</span><span class="n">frames</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">analysis_formatter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">selection</span><span class="p">,</span> <span class="n">format</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Calculate the average analysis value of the grain using the match format specified.&quot;&quot;&quot;</span>
@@ -381,6 +386,9 @@ div.nboutput > :nth-child(2).stderr {
<span class="p">}</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">selection</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">selection</span><span class="o">.</span><span class="n">size</span><span class="p">:</span>
<span class="c"># TODO: Add warning here</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="c"># For debugging apply_along_axis:</span>
<span class="c">#for ind, i in enumerate(selection):</span>
<span class="c"># output[ind] = self.formatter_func(i, frames, valid_inds, formatter=format_style_dict[format])</span>
+7 -3
View File
@@ -270,14 +270,13 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">CentroidAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;Centroid&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">CentroidAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;Centroid&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span> <span class="o">=</span> <span class="n">AnalysedAudioFile</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis_group</span> <span class="o">=</span> <span class="n">analysis_group</span>
<span class="n">frames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">read_grain</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating Centroid analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">)</span>
@@ -289,6 +288,9 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> Calculate the Centroid values of windowed segments of the audio file and</span>
<span class="sd"> save to disk.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">frames</span> <span class="o">=</span> <span class="n">frames</span><span class="p">()</span>
<span class="c"># Calculate the period of the window in hz</span>
<span class="c"># lowest_freq = 1.0 / window_size</span>
<span class="c"># Filter frequencies lower than the period of the window</span>
@@ -336,6 +338,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd">&quot;&quot;&quot;Calculate times for frames using sample size and samplerate.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sample_frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">sample_frames</span> <span class="o">=</span> <span class="n">sample_frames</span><span class="p">()</span>
<span class="c"># Get number of frames for time and frequency</span>
<span class="n">timebins</span> <span class="o">=</span> <span class="n">centroidframes</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c"># Create array ranging from 0 to number of time frames</span>
+64 -46
View File
@@ -243,6 +243,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="kn">from</span> <span class="nn">Analysis</span> <span class="kn">import</span> <span class="n">Analysis</span>
<span class="kn">from</span> <span class="nn">scipy</span> <span class="kn">import</span> <span class="n">signal</span>
<span class="kn">from</span> <span class="nn">numpy.fft</span> <span class="kn">import</span> <span class="n">fft</span><span class="p">,</span> <span class="n">ifft</span><span class="p">,</span> <span class="n">fftshift</span>
<span class="kn">from</span> <span class="nn">sppysound</span> <span class="kn">import</span> <span class="n">multirate</span>
<span class="kn">import</span> <span class="nn">warnings</span>
<span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">polyfit</span><span class="p">,</span> <span class="n">arange</span>
@@ -265,19 +266,33 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">F0Analysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;F0&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">F0Analysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span><span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;F0&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span> <span class="o">=</span> <span class="n">AnalysedAudioFile</span>
<span class="bp">self</span><span class="o">.</span><span class="n">nyquist_rate</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">samplerate</span> <span class="o">/</span> <span class="mf">2.</span>
<span class="k">if</span> <span class="n">config</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">window_size</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">f0</span><span class="p">[</span><span class="s">&quot;window_size&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">overlap</span> <span class="o">=</span> <span class="mf">1.</span> <span class="o">/</span> <span class="n">config</span><span class="o">.</span><span class="n">f0</span><span class="p">[</span><span class="s">&quot;overlap&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">threshold</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">f0</span><span class="p">[</span><span class="s">&quot;ratio_threshold&quot;</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">window_size</span><span class="o">=</span><span class="mi">512</span>
<span class="bp">self</span><span class="o">.</span><span class="n">overlap</span> <span class="o">=</span> <span class="mf">0.5</span>
<span class="bp">self</span><span class="o">.</span><span class="n">threshold</span> <span class="o">=</span> <span class="mf">0.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis_group</span> <span class="o">=</span> <span class="n">analysis_group</span>
<span class="n">frames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">read_grain</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating F0 analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">samplerate</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span>
<span class="n">frames</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">samplerate</span><span class="p">,</span>
<span class="n">window_size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">window_size</span><span class="p">,</span>
<span class="n">overlapFac</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">overlap</span><span class="p">,</span>
<span class="n">threshold</span><span class="o">=</span><span class="n">config</span><span class="o">.</span><span class="n">f0</span><span class="p">[</span><span class="s">&quot;ratio_threshold&quot;</span><span class="p">]</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">get_analysis_grains</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
@@ -291,8 +306,15 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">start</span> <span class="o">=</span> <span class="n">start</span> <span class="o">/</span> <span class="mi">1000</span>
<span class="n">end</span> <span class="o">=</span> <span class="n">end</span> <span class="o">/</span> <span class="mi">1000</span>
<span class="n">vtimes</span> <span class="o">=</span> <span class="n">times</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">nan_inds</span> <span class="o">=</span> <span class="n">hr</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">threshold</span>
<span class="n">hr</span><span class="p">[</span><span class="n">nan_inds</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="n">frames</span><span class="p">[</span><span class="n">nan_inds</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="n">selection</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">transpose</span><span class="p">((</span><span class="n">vtimes</span> <span class="o">&gt;=</span> <span class="n">start</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">vtimes</span> <span class="o">&lt;=</span> <span class="n">end</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">selection</span><span class="o">.</span><span class="n">any</span><span class="p">():</span>
<span class="n">frame_center</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="p">(</span><span class="n">end</span><span class="o">-</span><span class="n">start</span><span class="p">)</span><span class="o">/</span><span class="mf">2.</span>
<span class="n">closest_frames</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">vtimes</span><span class="o">-</span><span class="n">frame_center</span><span class="p">)</span><span class="o">.</span><span class="n">argsort</span><span class="p">()[:</span><span class="mi">2</span><span class="p">]</span>
<span class="n">selection</span><span class="p">[</span><span class="n">closest_frames</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">return</span> <span class="p">((</span><span class="n">frames</span><span class="p">,</span> <span class="n">times</span><span class="p">,</span> <span class="n">hr</span><span class="p">),</span> <span class="n">selection</span><span class="p">)</span>
@@ -302,6 +324,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">samplerate</span><span class="p">,</span>
<span class="n">window_size</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span>
<span class="n">overlapFac</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span>
<span class="n">threshold</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span>
<span class="n">m0</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
<span class="n">M</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
<span class="p">):</span>
@@ -311,8 +334,11 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> Calculate the frequency and harmonic ratio values of windowed segments</span>
<span class="sd"> of the audio file and save to disk.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">frames</span> <span class="o">=</span> <span class="n">frames</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">M</span><span class="p">:</span>
<span class="n">M</span><span class="o">=</span><span class="nb">round</span><span class="p">(</span><span class="mf">0.016</span><span class="o">*</span><span class="n">samplerate</span><span class="p">)</span>
<span class="n">M</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="mf">0.016</span><span class="o">*</span><span class="n">samplerate</span><span class="p">))</span>
<span class="n">hopSize</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">window_size</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">overlapFac</span> <span class="o">*</span> <span class="n">window_size</span><span class="p">))</span>
@@ -338,21 +364,6 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">Z</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">window</span><span class="o">.</span><span class="n">size</span><span class="p">))</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">window</span><span class="p">)</span><span class="o">-</span><span class="n">np</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">window2</span><span class="p">)))</span>
<span class="k">return</span> <span class="n">Z</span>
<span class="k">def</span> <span class="nf">autocorr</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> FFT based autocorrelation function, which is faster than numpy.correlate</span>
<span class="sd"> Operates on muti-dimensional arrays on a per element basis.</span>
<span class="sd"> Ref: http://stackoverflow.com/questions/4503325/autocorrelation-of-a-multidimensional-array-in-numpy</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">length</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">size</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="c"># x is supposed to be an array of sequences, of shape (totalelements, length)</span>
<span class="n">fftx</span> <span class="o">=</span> <span class="n">fft</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="p">(</span><span class="n">length</span><span class="o">*</span><span class="mi">2</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">ret</span> <span class="o">=</span> <span class="n">ifft</span><span class="p">(</span><span class="n">fftx</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">conjugate</span><span class="p">(</span><span class="n">fftx</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">real</span>
<span class="n">ret</span> <span class="o">=</span> <span class="n">fftshift</span><span class="p">(</span><span class="n">ret</span><span class="p">,</span> <span class="n">axes</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="k">return</span> <span class="n">ret</span>
<span class="k">def</span> <span class="nf">parabolic</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Quadratic interpolation for estimating the true position of an</span>
@@ -390,7 +401,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">f0</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="k">return</span> <span class="n">f0</span><span class="p">,</span> <span class="n">HR</span>
<span class="n">R</span><span class="o">=</span><span class="n">autocorr</span><span class="p">([</span><span class="n">frames</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
<span class="c">#R=autocorr([frames])[0]</span>
<span class="n">R</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">correlate</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s">&#39;full&#39;</span><span class="p">)</span>
<span class="n">g</span><span class="o">=</span><span class="n">R</span><span class="p">[</span><span class="n">frames</span><span class="o">.</span><span class="n">size</span><span class="p">]</span>
<span class="n">R</span><span class="o">=</span><span class="n">R</span><span class="p">[</span><span class="n">frames</span><span class="o">.</span><span class="n">size</span><span class="o">-</span><span class="mi">1</span><span class="p">:]</span>
@@ -412,25 +424,20 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">except</span> <span class="ne">Warning</span><span class="p">:</span>
<span class="k">pass</span>
<span class="n">Z</span> <span class="o">=</span> <span class="n">feature_zcr</span><span class="p">(</span><span class="n">Gamma</span><span class="p">)</span>
<span class="k">if</span> <span class="n">Z</span> <span class="o">&gt;</span> <span class="mf">0.15</span><span class="p">:</span>
<span class="c"># compute T0 and harmonic ratio:</span>
<span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">Gamma</span><span class="p">)</span><span class="o">.</span><span class="n">any</span><span class="p">():</span>
<span class="n">HR</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="n">f0</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># compute T0 and harmonic ratio:</span>
<span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">Gamma</span><span class="p">)</span><span class="o">.</span><span class="n">any</span><span class="p">():</span>
<span class="n">HR</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="n">blag</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">Gamma</span><span class="p">)</span>
<span class="n">HR</span> <span class="o">=</span> <span class="n">Gamma</span><span class="p">[</span><span class="n">blag</span><span class="p">]</span>
<span class="n">interp</span><span class="p">,</span> <span class="n">HR</span> <span class="o">=</span> <span class="n">parabolic</span><span class="p">(</span><span class="n">Gamma</span><span class="p">,</span> <span class="n">blag</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">interp</span><span class="p">:</span>
<span class="n">f0</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="n">HR</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">blag</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">Gamma</span><span class="p">)</span>
<span class="n">HR</span> <span class="o">=</span> <span class="n">Gamma</span><span class="p">[</span><span class="n">blag</span><span class="p">]</span>
<span class="n">interp</span><span class="p">,</span> <span class="n">HR</span> <span class="o">=</span> <span class="n">parabolic</span><span class="p">(</span><span class="n">Gamma</span><span class="p">,</span> <span class="n">blag</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">interp</span><span class="p">:</span>
<span class="n">f0</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="n">HR</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># get fundamental frequency:</span>
<span class="n">f0</span> <span class="o">=</span> <span class="n">samplerate</span> <span class="o">/</span> <span class="n">interp</span>
<span class="c"># get fundamental frequency:</span>
<span class="n">f0</span> <span class="o">=</span> <span class="n">samplerate</span> <span class="o">/</span> <span class="n">interp</span>
<span class="k">if</span> <span class="n">f0</span> <span class="o">&gt;</span> <span class="n">samplerate</span><span class="o">/</span><span class="mi">2</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;F0 value ({0}) is above the nyquist rate &quot;</span>
<span class="s">&quot;({1}). This shouldn&#39;t happen...&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">f0</span><span class="p">,</span>
@@ -451,10 +458,13 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> Formats the output from the analysis method to save to the HDF5 file.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">samplerate</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">samplerate</span>
<span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_f0_analysis</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">frames</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c"># frames = multirate.interp(frames, 4)</span>
<span class="n">samplerate</span> <span class="o">*=</span> <span class="mi">1</span>
<span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_f0_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="n">samplerate</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">f0</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span>
<span class="n">harmonic_ratio</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span>
<span class="n">f0_times</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calc_f0_frame_times</span><span class="p">(</span><span class="n">f0</span><span class="p">,</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">samplerate</span><span class="p">)</span>
<span class="n">f0_times</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calc_f0_frame_times</span><span class="p">(</span><span class="n">f0</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">samplerate</span><span class="p">)</span>
<span class="k">return</span> <span class="p">({</span><span class="s">&#39;frames&#39;</span><span class="p">:</span> <span class="n">f0</span><span class="p">,</span> <span class="s">&#39;harmonic_ratio&#39;</span><span class="p">:</span> <span class="n">harmonic_ratio</span><span class="p">,</span> <span class="s">&#39;times&#39;</span><span class="p">:</span> <span class="n">f0_times</span><span class="p">},</span> <span class="p">{})</span>
<span class="nd">@staticmethod</span>
@@ -462,6 +472,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd">&quot;&quot;&quot;Calculate times for frames using sample size and samplerate.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sample_frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">sample_frames</span> <span class="o">=</span> <span class="n">sample_frames</span><span class="p">()</span>
<span class="c"># Get number of frames for time and frequency</span>
<span class="n">timebins</span> <span class="o">=</span> <span class="n">f0frames</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c"># Create array ranging from 0 to number of time frames</span>
@@ -486,18 +498,24 @@ div.nboutput > :nth-child(2).stderr {
<span class="s">&#39;log2_median&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">log2_median</span><span class="p">,</span>
<span class="p">}</span>
<span class="c"># For debugging apply along axis:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">selection</span><span class="o">.</span><span class="n">size</span><span class="p">:</span>
<span class="c"># TODO: Add warning here</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="c">#for ind, i in enumerate(selection):</span>
<span class="c"># output[ind] = self.formatter_func(i, frames, valid_inds, harm_ratio, formatter=format_style_dict[format])</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">apply_along_axis</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">formatter_func</span><span class="p">,</span>
<span class="mi">1</span><span class="p">,</span>
<span class="n">selection</span><span class="p">,</span>
<span class="n">frames</span><span class="p">,</span>
<span class="n">valid_inds</span><span class="p">,</span>
<span class="n">formatter</span><span class="o">=</span><span class="n">format_style_dict</span><span class="p">[</span><span class="n">format</span><span class="p">]</span>
<span class="p">)</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">nyquist_rate</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">apply_along_axis</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">formatter_func</span><span class="p">,</span>
<span class="mi">1</span><span class="p">,</span>
<span class="n">selection</span><span class="p">,</span>
<span class="n">frames</span><span class="p">,</span>
<span class="n">valid_inds</span><span class="p">,</span>
<span class="n">formatter</span><span class="o">=</span><span class="n">format_style_dict</span><span class="p">[</span><span class="n">format</span><span class="p">]</span>
<span class="p">)</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">nyquist_rate</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="n">pdb</span><span class="o">.</span><span class="n">set_trace</span><span class="p">()</span>
<span class="k">return</span> <span class="n">output</span>
+21 -2
View File
@@ -260,12 +260,17 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> this object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">F0HarmRatioAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;F0HarmRatio&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">F0HarmRatioAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;F0HarmRatio&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span> <span class="o">=</span> <span class="n">AnalysedAudioFile</span>
<span class="k">if</span> <span class="n">config</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">threshold</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">f0</span><span class="p">[</span><span class="s">&quot;ratio_threshold&quot;</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">threshold</span> <span class="o">=</span> <span class="mf">0.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis_group</span> <span class="o">=</span> <span class="n">analysis_group</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Initialising F0HarmRatio analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
@@ -281,7 +286,14 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">end</span> <span class="o">=</span> <span class="n">end</span> <span class="o">/</span> <span class="mi">1000</span>
<span class="n">vtimes</span> <span class="o">=</span> <span class="n">times</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">nan_inds</span> <span class="o">=</span> <span class="n">hr</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">threshold</span>
<span class="n">hr</span><span class="p">[</span><span class="n">nan_inds</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="n">selection</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">transpose</span><span class="p">((</span><span class="n">vtimes</span> <span class="o">&gt;=</span> <span class="n">start</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">vtimes</span> <span class="o">&lt;=</span> <span class="n">end</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">selection</span><span class="o">.</span><span class="n">any</span><span class="p">():</span>
<span class="n">frame_center</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="p">(</span><span class="n">end</span><span class="o">-</span><span class="n">start</span><span class="p">)</span><span class="o">/</span><span class="mf">2.</span>
<span class="n">closest_frames</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">vtimes</span><span class="o">-</span><span class="n">frame_center</span><span class="p">)</span><span class="o">.</span><span class="n">argsort</span><span class="p">()[:</span><span class="mi">2</span><span class="p">]</span>
<span class="n">selection</span><span class="p">[</span><span class="n">closest_frames</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">return</span> <span class="p">((</span><span class="n">hr</span><span class="p">,</span> <span class="n">times</span><span class="p">),</span> <span class="n">selection</span><span class="p">)</span>
@@ -289,7 +301,10 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">def</span> <span class="nf">calc_F0HarmRatio_frame_times</span><span class="p">(</span><span class="n">F0HarmRatioframes</span><span class="p">,</span> <span class="n">sample_frames</span><span class="p">,</span> <span class="n">samplerate</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Calculate times for frames using sample size and samplerate.&quot;&quot;&quot;</span>
<span class="n">samplerate</span> <span class="o">*=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sample_frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">sample_frames</span> <span class="o">=</span> <span class="n">sample_frames</span><span class="p">()</span>
<span class="c"># Get number of frames for time and frequency</span>
<span class="n">timebins</span> <span class="o">=</span> <span class="n">F0HarmRatioframes</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c"># Create array ranging from 0 to number of time frames</span>
@@ -318,6 +333,10 @@ div.nboutput > :nth-child(2).stderr {
<span class="c">#for ind, i in enumerate(selection):</span>
<span class="c"># output[ind] = self.formatter_func(i, frames, valid_inds, harm_ratio, formatter=format_style_dict[format])</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">selection</span><span class="o">.</span><span class="n">size</span><span class="p">:</span>
<span class="c"># TODO: Add warning here</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">apply_along_axis</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">formatter_func</span><span class="p">,</span>
<span class="mi">1</span><span class="p">,</span>
+8 -5
View File
@@ -269,8 +269,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">FFTAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;FFT&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">FFTAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;FFT&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span> <span class="o">=</span> <span class="n">AnalysedAudioFile</span>
@@ -281,21 +281,22 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">window_size</span> <span class="o">=</span> <span class="mi">2048</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis_group</span> <span class="o">=</span> <span class="n">analysis_group</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating FFT analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span><span class="n">window_size</span><span class="o">=</span><span class="n">window_size</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="n">window_size</span><span class="o">=</span><span class="n">window_size</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fft_window_count</span> <span class="o">=</span> <span class="bp">None</span>
<div class="viewcode-block" id="FFTAnalysis.create_fft_analysis"><a class="viewcode-back" href="../../api.html#analysis.FFTAnalysis.create_fft_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_fft_analysis</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">window_size</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span> <span class="n">window_overlap</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<div class="viewcode-block" id="FFTAnalysis.create_fft_analysis"><a class="viewcode-back" href="../../api.html#analysis.FFTAnalysis.create_fft_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_fft_analysis</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">window_size</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span> <span class="n">window_overlap</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="n">window_type</span><span class="o">=</span><span class="s">&#39;hanning&#39;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create a spectral analysis for overlapping frames of audio.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">frames</span> <span class="o">=</span> <span class="n">frames</span><span class="p">()</span>
<span class="c"># Calculate the period of the window in hz</span>
<span class="n">lowest_freq</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="n">window_size</span>
<span class="c"># Filter frequencies lower than the period of the window</span>
<span class="c"># filter = ButterFilter()</span>
<span class="c"># filter.design_butter(lowest_freq, self.AnalysedAudioFile.samplerate)</span>
<span class="n">frames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">read_grain</span><span class="p">()</span>
<span class="c"># frames = filter.filter_butter(frames)</span>
<span class="n">stft</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stft</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="n">window_size</span><span class="p">,</span> <span class="n">overlapFac</span><span class="o">=</span><span class="mi">1</span><span class="o">/</span><span class="n">window_overlap</span><span class="p">)</span>
<span class="n">frame_times</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calc_fft_frame_times</span><span class="p">(</span>
@@ -455,6 +456,8 @@ div.nboutput > :nth-child(2).stderr {
<div class="viewcode-block" id="FFTAnalysis.calc_fft_frame_times"><a class="viewcode-back" href="../../api.html#analysis.FFTAnalysis.calc_fft_frame_times">[docs]</a> <span class="k">def</span> <span class="nf">calc_fft_frame_times</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fftframes</span><span class="p">,</span> <span class="n">sample_frames</span><span class="p">,</span> <span class="n">samplerate</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Calculate times for frames using sample size and samplerate.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sample_frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">sample_frames</span> <span class="o">=</span> <span class="n">sample_frames</span><span class="p">()</span>
<span class="c"># Get number of frames for time and frequency</span>
<span class="n">timebins</span><span class="p">,</span> <span class="n">freqbins</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">shape</span><span class="p">(</span><span class="n">fftframes</span><span class="p">)</span>
<span class="c"># Create array ranging from 0 to number of time frames</span>
+17 -5
View File
@@ -266,8 +266,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">KurtosisAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;kurtosis&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">KurtosisAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span><span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;kurtosis&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span> <span class="o">=</span> <span class="n">AnalysedAudioFile</span>
@@ -283,17 +283,23 @@ div.nboutput > :nth-child(2).stderr {
<span class="s">&quot;analysis.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis_group</span> <span class="o">=</span> <span class="n">analysis_group</span>
<span class="n">frames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">read_grain</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating kurtosis analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="n">variance</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">][:],</span> <span class="bp">self</span><span class="o">.</span><span class="n">window_size</span><span class="p">,</span> <span class="n">overlapFac</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">overlap</span><span class="p">)</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">create_kurtosis_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="n">variance</span><span class="p">,</span> <span class="n">window_size</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span>
<span class="n">overlapFac</span><span class="o">=</span><span class="mf">0.5</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">create_kurtosis_analysis</span><span class="p">(</span>
<span class="n">frames</span><span class="p">,</span>
<span class="n">variance</span><span class="p">,</span>
<span class="n">window_size</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span>
<span class="n">window</span><span class="o">=</span><span class="n">signal</span><span class="o">.</span><span class="n">hanning</span><span class="p">,</span>
<span class="n">overlapFac</span><span class="o">=</span><span class="mf">0.5</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Calculate the Kurtosis values of windowed segments of the audio file and</span>
<span class="sd"> save to disk.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">frames</span> <span class="o">=</span> <span class="n">frames</span><span class="p">()</span>
<span class="c"># Calculate the period of the window in hz</span>
<span class="c"># lowest_freq = 1.0 / window_size</span>
<span class="c"># Filter frequencies lower than the period of the window</span>
@@ -318,6 +324,10 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">strides</span><span class="o">=</span><span class="p">(</span><span class="n">samples</span><span class="o">.</span><span class="n">strides</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">hopSize</span><span class="p">,</span> <span class="n">samples</span><span class="o">.</span><span class="n">strides</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="p">)</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="k">if</span> <span class="n">window</span><span class="p">:</span>
<span class="n">win</span> <span class="o">=</span> <span class="n">window</span><span class="p">(</span><span class="n">window_size</span><span class="p">)</span>
<span class="n">frames</span> <span class="o">*=</span> <span class="n">win</span>
<span class="n">frame_mean</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">variance_sqrd</span> <span class="o">=</span> <span class="n">variance</span><span class="o">**</span><span class="mi">2</span>
@@ -342,6 +352,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd">&quot;&quot;&quot;Calculate times for frames using sample size and samplerate.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sample_frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">sample_frames</span> <span class="o">=</span> <span class="n">sample_frames</span><span class="p">()</span>
<span class="c"># Get number of frames for time and frequency</span>
<span class="n">timebins</span> <span class="o">=</span> <span class="n">kurtosisframes</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c"># Create array ranging from 0 to number of time frames</span>
+6 -3
View File
@@ -267,14 +267,13 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">PeakAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;Peak&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">PeakAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span><span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;Peak&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span> <span class="o">=</span> <span class="n">AnalysedAudioFile</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis_group</span> <span class="o">=</span> <span class="n">analysis_group</span>
<span class="n">frames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">read_grain</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating Peak analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">)</span>
@@ -286,6 +285,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> Calculate the Peak values of windowed segments of the audio file and</span>
<span class="sd"> save to disk.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">frames</span> <span class="o">=</span> <span class="n">frames</span><span class="p">()</span>
<span class="c"># Calculate the period of the window in hz</span>
<span class="c"># lowest_freq = 1.0 / window_size</span>
<span class="c"># Filter frequencies lower than the period of the window</span>
@@ -329,6 +330,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd">&quot;&quot;&quot;Calculate times for frames using sample size and samplerate.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sample_frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">sample_frames</span> <span class="o">=</span> <span class="n">sample_frames</span><span class="p">()</span>
<span class="c"># Get number of frames for time and frequency</span>
<span class="n">timebins</span> <span class="o">=</span> <span class="n">peakframes</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c"># Create array ranging from 0 to number of time frames</span>
+17 -10
View File
@@ -269,14 +269,13 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">RMSAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;RMS&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">RMSAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span><span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;RMS&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span> <span class="o">=</span> <span class="n">AnalysedAudioFile</span>
<span class="k">if</span> <span class="n">config</span><span class="p">:</span>
<span class="c"># TODO: create case for when config isn&#39;t present.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">window_size</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">rms</span><span class="p">[</span><span class="s">&quot;window_size&quot;</span><span class="p">]</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">samplerate</span> <span class="o">/</span> <span class="mi">1000</span>
<span class="bp">self</span><span class="o">.</span><span class="n">overlap</span> <span class="o">=</span> <span class="mf">1.</span> <span class="o">/</span> <span class="n">config</span><span class="o">.</span><span class="n">rms</span><span class="p">[</span><span class="s">&quot;overlap&quot;</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
@@ -284,20 +283,25 @@ div.nboutput > :nth-child(2).stderr {
<span class="bp">self</span><span class="o">.</span><span class="n">overlap</span> <span class="o">=</span> <span class="mf">0.5</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis_group</span> <span class="o">=</span> <span class="n">analysis_group</span>
<span class="n">frames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">read_grain</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating RMS analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">samplerate</span><span class="p">,</span> <span class="n">window_size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">window_size</span><span class="p">,</span> <span class="n">overlapFac</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">overlap</span><span class="p">,</span> <span class="p">)</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">create_rms_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span><span class="n">samplerate</span><span class="p">,</span> <span class="n">window_size</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span>
<span class="n">window</span><span class="o">=</span><span class="n">signal</span><span class="o">.</span><span class="n">triang</span><span class="p">,</span>
<span class="n">overlapFac</span><span class="o">=</span><span class="mf">0.5</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">create_rms_analysis</span><span class="p">(</span>
<span class="n">frames</span><span class="p">,</span>
<span class="n">samplerate</span><span class="p">,</span>
<span class="n">window_size</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span>
<span class="n">window</span><span class="o">=</span><span class="n">signal</span><span class="o">.</span><span class="n">hanning</span><span class="p">,</span>
<span class="n">overlapFac</span><span class="o">=</span><span class="mf">0.5</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Generate RMS contour analysis.</span>
<span class="sd"> Calculate the RMS values of windowed segments of the audio file and</span>
<span class="sd"> save to disk.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">frames</span> <span class="o">=</span> <span class="n">frames</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">butter_lowpass</span><span class="p">(</span><span class="n">cutoff</span><span class="p">,</span> <span class="n">fs</span><span class="p">,</span> <span class="n">order</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
<span class="c"># red: taken from http://stackoverflow.com/questions/25191620/creating-lowpass-filter-in-scipy-understanding-methods-and-units</span>
<span class="n">nyq</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">fs</span>
@@ -317,7 +321,6 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># Generate a window function to apply to rms windows before analysis</span>
<span class="n">win</span> <span class="o">=</span> <span class="n">window</span><span class="p">(</span><span class="n">window_size</span><span class="p">)</span>
<span class="n">hopSize</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">window_size</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">overlapFac</span> <span class="o">*</span> <span class="n">window_size</span><span class="p">))</span>
<span class="c"># zeros at beginning (thus center of 1st window should be for sample nr. 0)</span>
@@ -334,8 +337,10 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">strides</span><span class="o">=</span><span class="p">(</span><span class="n">samples</span><span class="o">.</span><span class="n">strides</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">hopSize</span><span class="p">,</span> <span class="n">samples</span><span class="o">.</span><span class="n">strides</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="p">)</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">frames</span> <span class="o">*=</span> <span class="n">win</span>
<span class="n">rms</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">square</span><span class="p">(</span><span class="n">frames</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
<span class="k">if</span> <span class="n">window</span><span class="p">:</span>
<span class="n">win</span> <span class="o">=</span> <span class="n">window</span><span class="p">(</span><span class="n">window_size</span><span class="p">)</span>
<span class="n">frames</span> <span class="o">*=</span> <span class="n">win</span>
<span class="n">rms</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">square</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">frames</span><span class="p">)),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
<span class="k">return</span> <span class="n">rms</span>
@@ -354,6 +359,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd">&quot;&quot;&quot;Calculate times for frames using sample size and samplerate.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sample_frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">sample_frames</span> <span class="o">=</span> <span class="n">sample_frames</span><span class="p">()</span>
<span class="c"># Get number of frames for time and frequency</span>
<span class="n">timebins</span> <span class="o">=</span> <span class="n">rmsframes</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c"># Create array ranging from 0 to number of time frames</span>
@@ -258,8 +258,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">SpectralCentroidAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;SpcCntr&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">SpectralCentroidAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span><span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;SpcCntr&#39;</span><span class="p">)</span>
<span class="c"># Create logger for module</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
@@ -275,8 +275,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating Spectral Centroid analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_spccntr_analysis</span><span class="p">,</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">][:],</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">attrs</span><span class="p">[</span><span class="s">&#39;win_size&#39;</span><span class="p">],</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">],</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">samplerate</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">spccntr_window_count</span> <span class="o">=</span> <span class="bp">None</span>
@@ -291,15 +290,15 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">return</span> <span class="p">({</span><span class="s">&#39;frames&#39;</span><span class="p">:</span> <span class="n">output</span><span class="p">,</span> <span class="s">&#39;times&#39;</span><span class="p">:</span> <span class="n">times</span><span class="p">},</span> <span class="p">{})</span></div>
<span class="nd">@staticmethod</span>
<div class="viewcode-block" id="SpectralCentroidAnalysis.create_spccntr_analysis"><a class="viewcode-back" href="../../api.html#analysis.SpectralCentroidAnalysis.create_spccntr_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_spccntr_analysis</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">samplerate</span><span class="p">,</span> <span class="n">output_format</span><span class="o">=</span><span class="s">&quot;freq&quot;</span><span class="p">):</span>
<div class="viewcode-block" id="SpectralCentroidAnalysis.create_spccntr_analysis"><a class="viewcode-back" href="../../api.html#analysis.SpectralCentroidAnalysis.create_spccntr_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_spccntr_analysis</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">samplerate</span><span class="p">,</span> <span class="n">output_format</span><span class="o">=</span><span class="s">&quot;ind&quot;</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Calculate the spectral centroid of the fft frames.</span>
<span class="sd"> length: the length of the window used to calculate the FFT.</span>
<span class="sd"> samplerate: the samplerate of the audio analysed.</span>
<span class="sd"> output_format = Choose either &quot;freq&quot; for output in Hz or &quot;ind&quot; for bin</span>
<span class="sd"> index output</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">fft</span> <span class="o">=</span> <span class="n">fft</span><span class="p">[:]</span>
<span class="c"># Get the positive magnitudes of each bin.</span>
<span class="n">magnitudes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">fft</span><span class="p">)</span>
<span class="c"># Get the highest magnitude.</span>
@@ -310,16 +309,15 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">return</span> <span class="n">y</span>
<span class="c"># Calculate the centre frequency of each rfft bin.</span>
<span class="k">if</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s">&quot;freq&quot;</span><span class="p">:</span>
<span class="n">freqs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">fft</span><span class="o">.</span><span class="n">rfftfreq</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="mf">1.0</span><span class="o">/</span><span class="n">samplerate</span><span class="p">)</span>
<span class="n">freqs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">fft</span><span class="o">.</span><span class="n">rfftfreq</span><span class="p">((</span><span class="n">np</span><span class="o">.</span><span class="n">size</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mf">1.0</span><span class="o">/</span><span class="n">samplerate</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s">&quot;ind&quot;</span><span class="p">:</span>
<span class="n">freqs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">size</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\&#39;</span><span class="s">{0}</span><span class="se">\&#39;</span><span class="s"> is not a valid output &quot;</span>
<span class="s">&quot;format.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">output_format</span><span class="p">))</span>
<span class="c"># Calculate the weighted mean</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">magnitudes</span><span class="o">*</span><span class="n">freqs</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">magnitudes</span><span class="o">*</span><span class="n">freqs</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
<span class="c"># Convert from index to Hz</span>
<span class="k">return</span> <span class="n">y</span></div>
<span class="nd">@staticmethod</span>
@@ -259,8 +259,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">SpectralCrestFactorAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;SpcCrestFactor&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">SpectralCrestFactorAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;SpcCrestFactor&#39;</span><span class="p">)</span>
<span class="c"># Create logger for module</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
@@ -276,9 +276,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating Spectral CrestFactor analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_spccf_analysis</span><span class="p">,</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">][:],</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">attrs</span><span class="p">[</span><span class="s">&#39;win_size&#39;</span><span class="p">],</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">samplerate</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">],</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">spccf_window_count</span> <span class="o">=</span> <span class="bp">None</span>
@@ -292,19 +290,15 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">return</span> <span class="p">({</span><span class="s">&#39;frames&#39;</span><span class="p">:</span> <span class="n">output</span><span class="p">,</span> <span class="s">&#39;times&#39;</span><span class="p">:</span> <span class="n">times</span><span class="p">},</span> <span class="p">{})</span></div>
<span class="nd">@staticmethod</span>
<div class="viewcode-block" id="SpectralCrestFactorAnalysis.create_spccf_analysis"><a class="viewcode-back" href="../../api.html#analysis.SpectralCrestFactorAnalysis.create_spccf_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_spccf_analysis</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">samplerate</span><span class="p">,</span> <span class="n">output_format</span><span class="o">=</span><span class="s">&quot;freq&quot;</span><span class="p">):</span>
<div class="viewcode-block" id="SpectralCrestFactorAnalysis.create_spccf_analysis"><a class="viewcode-back" href="../../api.html#analysis.SpectralCrestFactorAnalysis.create_spccf_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_spccf_analysis</span><span class="p">(</span><span class="n">fft</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Calculate the spectral crest factor of the fft frames.</span>
<span class="sd"> length: the length of the window used to calculate the FFT.</span>
<span class="sd"> samplerate: the samplerate of the audio analysed.</span>
<span class="sd"> output_format = Choose either &quot;freq&quot; for output in Hz or &quot;ind&quot; for bin</span>
<span class="sd"> index output</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">fft</span> <span class="o">=</span> <span class="n">fft</span><span class="p">[:]</span>
<span class="c"># Get the positive magnitudes of each bin.</span>
<span class="n">magnitudes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">fft</span><span class="p">)</span>
<span class="c"># Get highest magnitude</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">nonzero</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">any</span><span class="p">():</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">nonzero</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">size</span><span class="p">:</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="n">magnitudes</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">y</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">nan</span><span class="p">)</span>
<span class="k">return</span> <span class="n">y</span>
@@ -315,7 +309,6 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s">&#39;ignore&#39;</span><span class="p">)</span>
<span class="n">spectral_cf</span> <span class="o">=</span> <span class="n">max_bins</span> <span class="o">/</span> <span class="n">mag_sum</span>
<span class="k">return</span> <span class="n">spectral_cf</span></div>
<span class="nd">@staticmethod</span>
+7 -13
View File
@@ -260,8 +260,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">SpectralFlatnessAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;SpcFlatness&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">SpectralFlatnessAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span><span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;SpcFlatness&#39;</span><span class="p">)</span>
<span class="c"># Create logger for module</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
@@ -277,9 +277,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating Spectral Flatness analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_spcflatness_analysis</span><span class="p">,</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">][:],</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">attrs</span><span class="p">[</span><span class="s">&#39;win_size&#39;</span><span class="p">],</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">samplerate</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">],</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">spcflatness_window_count</span> <span class="o">=</span> <span class="bp">None</span>
@@ -293,18 +291,14 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">return</span> <span class="p">({</span><span class="s">&#39;frames&#39;</span><span class="p">:</span> <span class="n">output</span><span class="p">,</span> <span class="s">&#39;times&#39;</span><span class="p">:</span> <span class="n">times</span><span class="p">},</span> <span class="p">{})</span></div>
<span class="nd">@staticmethod</span>
<div class="viewcode-block" id="SpectralFlatnessAnalysis.create_spcflatness_analysis"><a class="viewcode-back" href="../../api.html#analysis.SpectralFlatnessAnalysis.create_spcflatness_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_spcflatness_analysis</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">samplerate</span><span class="p">,</span> <span class="n">output_format</span><span class="o">=</span><span class="s">&quot;freq&quot;</span><span class="p">):</span>
<div class="viewcode-block" id="SpectralFlatnessAnalysis.create_spcflatness_analysis"><a class="viewcode-back" href="../../api.html#analysis.SpectralFlatnessAnalysis.create_spcflatness_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_spcflatness_analysis</span><span class="p">(</span><span class="n">fft</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Calculate the spectral flatness of the fft frames.</span>
<span class="sd"> length: the length of the window used to calculate the FFT.</span>
<span class="sd"> samplerate: the samplerate of the audio analysed.</span>
<span class="sd"> output_format = Choose either &quot;freq&quot; for output in Hz or &quot;ind&quot; for bin</span>
<span class="sd"> index output</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">fft</span> <span class="o">=</span> <span class="n">fft</span><span class="p">[:]</span>
<span class="c"># Get the positive magnitudes of each bin.</span>
<span class="n">magnitudes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">fft</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">nonzero</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">any</span><span class="p">():</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">nonzero</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">size</span><span class="p">:</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="n">magnitudes</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">y</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">nan</span><span class="p">)</span>
<span class="k">return</span> <span class="n">y</span>
@@ -313,7 +307,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s">&#39;ignore&#39;</span><span class="p">)</span>
<span class="c"># Calculate the geometric mean of magnitudes</span>
<span class="n">geo_mean</span> <span class="o">=</span> <span class="n">stats</span><span class="o">.</span><span class="n">gmean</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">geo_mean</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">e</span><span class="o">**</span><span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="c"># Calculate the arithmetic mean of magnitudes</span>
<span class="n">arith_mean</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">spectral_flatness</span> <span class="o">=</span> <span class="n">geo_mean</span> <span class="o">/</span> <span class="n">arith_mean</span>
+9 -10
View File
@@ -258,8 +258,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">SpectralFluxAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;SpcFlux&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">SpectralFluxAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span><span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;SpcFlux&#39;</span><span class="p">)</span>
<span class="c"># Create logger for module</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
@@ -275,9 +275,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating Spectral Flux analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_spcflux_analysis</span><span class="p">,</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">][:],</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">attrs</span><span class="p">[</span><span class="s">&#39;win_size&#39;</span><span class="p">],</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">samplerate</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">],</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">spcflux_window_count</span> <span class="o">=</span> <span class="bp">None</span>
@@ -291,19 +289,18 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">return</span> <span class="p">({</span><span class="s">&#39;frames&#39;</span><span class="p">:</span> <span class="n">output</span><span class="p">,</span> <span class="s">&#39;times&#39;</span><span class="p">:</span> <span class="n">times</span><span class="p">},</span> <span class="p">{})</span></div>
<span class="nd">@staticmethod</span>
<div class="viewcode-block" id="SpectralFluxAnalysis.create_spcflux_analysis"><a class="viewcode-back" href="../../api.html#analysis.SpectralFluxAnalysis.create_spcflux_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_spcflux_analysis</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">samplerate</span><span class="p">,</span> <span class="n">output_format</span><span class="o">=</span><span class="s">&quot;freq&quot;</span><span class="p">):</span>
<div class="viewcode-block" id="SpectralFluxAnalysis.create_spcflux_analysis"><a class="viewcode-back" href="../../api.html#analysis.SpectralFluxAnalysis.create_spcflux_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_spcflux_analysis</span><span class="p">(</span><span class="n">fft</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Calculate the spectral flux of the fft frames.</span>
<span class="sd"> length: the length of the window used to calculate the FFT.</span>
<span class="sd"> samplerate: the samplerate of the audio analysed.</span>
<span class="sd"> output_format = Choose either &quot;freq&quot; for output in Hz or &quot;ind&quot; for bin</span>
<span class="sd"> index output</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">fft</span> <span class="o">=</span> <span class="n">fft</span><span class="p">[:]</span>
<span class="c"># Get the positive magnitudes of each bin.</span>
<span class="n">magnitudes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">fft</span><span class="p">)</span>
<span class="c"># Get highest magnitude</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">nonzero</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">any</span><span class="p">():</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">nonzero</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">size</span><span class="p">:</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="n">magnitudes</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">y</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">nan</span><span class="p">)</span>
<span class="k">return</span> <span class="n">y</span>
@@ -312,7 +309,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># magnitude.</span>
<span class="n">rolled_mags</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">roll</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)[</span><span class="mi">1</span><span class="p">:]</span>
<span class="n">sum_of_squares</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">((</span><span class="n">magnitudes</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span><span class="o">-</span><span class="n">rolled_mags</span><span class="p">)</span><span class="o">**</span><span class="mf">2.</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">spectral_flux</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">sum_of_squares</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">length</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">spectral_flux</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">sum_of_squares</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">size</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
<span class="k">return</span> <span class="n">spectral_flux</span></div>
@@ -323,6 +320,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># Get number of frames for time and frequency</span>
<span class="n">timebins</span> <span class="o">=</span> <span class="n">spcflux_frames</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">timebins</span><span class="p">:</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([])</span>
<span class="c"># Create array ranging from 0 to number of time frames</span>
<span class="n">scale</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">timebins</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
<span class="c"># divide the number of samples by the total number of frames, then</span>
+11 -10
View File
@@ -258,8 +258,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">SpectralSpreadAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;SpcSprd&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">SpectralSpreadAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span><span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;SpcSprd&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span> <span class="o">=</span> <span class="n">AnalysedAudioFile</span>
@@ -278,9 +278,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="bp">self</span><span class="o">.</span><span class="n">analysis_group</span> <span class="o">=</span> <span class="n">analysis_group</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating Spectral Spread analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">][:],</span>
<span class="n">spccntr</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">][:],</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">attrs</span><span class="p">[</span><span class="s">&#39;win_size&#39;</span><span class="p">],</span>
<span class="n">fft</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">],</span>
<span class="n">spccntr</span><span class="o">.</span><span class="n">analysis</span><span class="p">[</span><span class="s">&#39;frames&#39;</span><span class="p">],</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">samplerate</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">spccntr_window_count</span> <span class="o">=</span> <span class="bp">None</span>
@@ -295,7 +294,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">return</span> <span class="p">({</span><span class="s">&#39;frames&#39;</span><span class="p">:</span> <span class="n">output</span><span class="p">,</span> <span class="s">&#39;times&#39;</span><span class="p">:</span> <span class="n">times</span><span class="p">},</span> <span class="p">{})</span></div>
<span class="nd">@staticmethod</span>
<div class="viewcode-block" id="SpectralSpreadAnalysis.create_spcsprd_analysis"><a class="viewcode-back" href="../../api.html#analysis.SpectralSpreadAnalysis.create_spcsprd_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_spcsprd_analysis</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">spectral_centroid</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">samplerate</span><span class="p">,</span> <span class="n">output_format</span> <span class="o">=</span> <span class="s">&quot;freq&quot;</span><span class="p">):</span>
<div class="viewcode-block" id="SpectralSpreadAnalysis.create_spcsprd_analysis"><a class="viewcode-back" href="../../api.html#analysis.SpectralSpreadAnalysis.create_spcsprd_analysis">[docs]</a> <span class="k">def</span> <span class="nf">create_spcsprd_analysis</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">spectral_centroid</span><span class="p">,</span> <span class="n">samplerate</span><span class="p">,</span> <span class="n">output_format</span> <span class="o">=</span> <span class="s">&quot;ind&quot;</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Calculate the spectral spread of the fft frames.</span>
@@ -304,6 +303,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> length: the length of the window used to calculate the FFT.</span>
<span class="sd"> samplerate: the samplerate of the audio analysed.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">fft</span> <span class="o">=</span> <span class="n">fft</span><span class="p">[:]</span>
<span class="n">spectral_centroid</span> <span class="o">=</span> <span class="n">spectral_centroid</span><span class="p">[:]</span>
<span class="c"># Get the positive magnitudes of each bin.</span>
<span class="n">magnitudes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">fft</span><span class="p">)</span>
<span class="n">mag_max</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">)</span>
@@ -315,17 +316,17 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">if</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s">&quot;ind&quot;</span><span class="p">:</span>
<span class="n">freqs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">size</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">output_format</span> <span class="o">==</span> <span class="s">&quot;freq&quot;</span><span class="p">:</span>
<span class="n">freqs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">fft</span><span class="o">.</span><span class="n">rfftfreq</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="mf">1.0</span><span class="o">/</span><span class="n">samplerate</span><span class="p">)</span>
<span class="n">freqs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">fft</span><span class="o">.</span><span class="n">rfftfreq</span><span class="p">((</span><span class="n">np</span><span class="o">.</span><span class="n">size</span><span class="p">(</span><span class="n">fft</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mf">1.0</span><span class="o">/</span><span class="n">samplerate</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\&#39;</span><span class="s">{0}</span><span class="se">\&#39;</span><span class="s"> is not a valid output &quot;</span>
<span class="s">&quot;format.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">output_format</span><span class="p">))</span>
<span class="n">spectral_centroid</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">(</span><span class="n">spectral_centroid</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="n">freqs</span><span class="o">-</span><span class="n">spectral_centroid</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">mag_sqrd</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="n">magnitudes</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">freqs</span><span class="o">-</span><span class="n">spectral_centroid</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span>
<span class="n">mag_sqrd</span> <span class="o">=</span> <span class="n">magnitudes</span><span class="o">**</span><span class="mi">2</span>
<span class="c"># Calculate the weighted mean</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">a</span><span class="o">*</span><span class="n">mag_sqrd</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">mag_sqrd</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">))</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">a</span><span class="o">*</span><span class="n">mag_sqrd</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">mag_sqrd</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)))</span>
<span class="k">return</span> <span class="n">y</span></div>
+6 -3
View File
@@ -268,8 +268,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">VarianceAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;variance&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">VarianceAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span><span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;variance&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Store reference to the file to be analysed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span> <span class="o">=</span> <span class="n">AnalysedAudioFile</span>
@@ -279,7 +279,6 @@ div.nboutput > :nth-child(2).stderr {
<span class="bp">self</span><span class="o">.</span><span class="n">overlap</span> <span class="o">=</span> <span class="mf">1.</span> <span class="o">/</span> <span class="n">config</span><span class="o">.</span><span class="n">variance</span><span class="p">[</span><span class="s">&quot;overlap&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis_group</span> <span class="o">=</span> <span class="n">analysis_group</span>
<span class="n">frames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">read_grain</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating variance analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">window_size</span><span class="p">,</span> <span class="n">overlapFac</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">overlap</span><span class="p">)</span>
@@ -300,6 +299,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># TODO: Fix filter</span>
<span class="c"># frames = filter.filter_butter(frames)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">frames</span> <span class="o">=</span> <span class="n">frames</span><span class="p">()</span>
<span class="n">hopSize</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">window_size</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">overlapFac</span> <span class="o">*</span> <span class="n">window_size</span><span class="p">))</span>
<span class="c"># zeros at beginning (thus center of 1st window should be for sample nr. 0)</span>
@@ -335,6 +336,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd">&quot;&quot;&quot;Calculate times for frames using sample size and samplerate.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sample_frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">sample_frames</span> <span class="o">=</span> <span class="n">sample_frames</span><span class="p">()</span>
<span class="c"># Get number of frames for time and frequency</span>
<span class="n">timebins</span> <span class="o">=</span> <span class="n">varianceframes</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c"># Create array ranging from 0 to number of time frames</span>
+19 -6
View File
@@ -262,17 +262,24 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> - config: The configuration module used to configure the analysis</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">ZeroXAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;ZeroCrossing&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">AnalysedAudioFile</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">ZeroXAnalysis</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">AnalysedAudioFile</span><span class="p">,</span><span class="n">frames</span><span class="p">,</span> <span class="n">analysis_group</span><span class="p">,</span> <span class="s">&#39;ZeroCrossing&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="o">+</span><span class="s">&#39;.{0}Analysis&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis_group</span> <span class="o">=</span> <span class="n">analysis_group</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Creating zero crossing analysis for {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="n">frames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">AnalysedAudioFile</span><span class="o">.</span><span class="n">read_grain</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">)</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">create_zerox_analysis</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="n">window_size</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span> <span class="n">overlapFac</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">create_zerox_analysis</span><span class="p">(</span>
<span class="n">frames</span><span class="p">,</span>
<span class="n">window_size</span><span class="o">=</span><span class="mi">512</span><span class="p">,</span>
<span class="n">overlapFac</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span>
<span class="o">*</span><span class="n">args</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Generate zero crossing value for window of the signal&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">frames</span> <span class="o">=</span> <span class="n">frames</span><span class="p">()</span>
<span class="n">hopSize</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">window_size</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">overlapFac</span> <span class="o">*</span> <span class="n">window_size</span><span class="p">))</span>
<span class="c"># zeros at beginning (thus center of 1st window should be for sample nr. 0)</span>
@@ -283,13 +290,17 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># zeros at end (thus samples can be fully covered by frames)</span>
<span class="n">samples</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">samples</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">window_size</span><span class="p">))</span>
<span class="c"># TODO: Better handeling of zeros based on previous sign would improve</span>
<span class="c"># accuracy.</span>
<span class="n">epsilon</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span>
<span class="n">samples</span><span class="p">[</span><span class="n">samples</span> <span class="o">==</span> <span class="mf">0.</span><span class="p">]</span> <span class="o">+=</span> <span class="n">epsilon</span>
<span class="n">frames</span> <span class="o">=</span> <span class="n">stride_tricks</span><span class="o">.</span><span class="n">as_strided</span><span class="p">(</span>
<span class="n">samples</span><span class="p">,</span>
<span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">cols</span><span class="p">,</span> <span class="n">window_size</span><span class="p">),</span>
<span class="n">strides</span><span class="o">=</span><span class="p">(</span><span class="n">samples</span><span class="o">.</span><span class="n">strides</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">hopSize</span><span class="p">,</span> <span class="n">samples</span><span class="o">.</span><span class="n">strides</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="p">)</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">zero_crossing</span> <span class="o">=</span> <span class="p">(</span><span class="mf">1.</span><span class="o">/</span><span class="p">(</span><span class="mf">2.</span><span class="o">*</span><span class="n">samples</span><span class="o">.</span><span class="n">size</span><span class="p">))</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">diff</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">frames</span><span class="p">))),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">zero_crossing</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">diff</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">frames</span><span class="p">))),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="k">return</span> <span class="n">zero_crossing</span>
<span class="nd">@staticmethod</span>
@@ -297,6 +308,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd">&quot;&quot;&quot;Calculate times for frames using sample size and samplerate.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sample_frames</span><span class="p">,</span> <span class="s">&#39;__call__&#39;</span><span class="p">):</span>
<span class="n">sample_frames</span> <span class="o">=</span> <span class="n">sample_frames</span><span class="p">()</span>
<span class="c"># Get number of frames for time and frequency</span>
<span class="n">timebins</span> <span class="o">=</span> <span class="n">zerox_frames</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c"># Create array ranging from 0 to number of time frames</span>
+5 -7
View File
@@ -323,7 +323,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Allow AudioFile object to be opened by &#39;with&#39; statements&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Opening soundfile {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filepath</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;Opening soundfile {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filepath</span><span class="p">))</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mode</span> <span class="o">==</span> <span class="s">&#39;r&#39;</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filepath</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span>
@@ -866,9 +866,9 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">position</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ms_to_samps</span><span class="p">(</span><span class="n">position</span><span class="p">)</span>
<span class="c"># multiply samples by the fade values from the start position for</span>
<span class="c"># the duration of the fade</span>
<span class="n">audio</span><span class="p">[</span><span class="n">position</span><span class="p">:</span><span class="n">position</span><span class="o">+</span><span class="n">fade</span><span class="o">.</span><span class="n">size</span><span class="p">]</span> <span class="o">*=</span> <span class="n">fade</span>
<span class="n">audio</span><span class="p">[</span><span class="o">-</span><span class="n">position</span><span class="p">:</span><span class="n">position</span><span class="o">-</span><span class="n">fade</span><span class="o">.</span><span class="n">size</span><span class="p">]</span> <span class="o">*=</span> <span class="n">fade</span>
<span class="c"># zero any samples after the fade in</span>
<span class="n">audio</span><span class="p">[</span><span class="n">position</span><span class="o">+</span><span class="n">fade</span><span class="o">.</span><span class="n">size</span><span class="p">:]</span> <span class="o">*=</span> <span class="mi">0</span>
<span class="n">audio</span><span class="p">[</span><span class="o">-</span><span class="n">position</span><span class="o">-</span><span class="n">fade</span><span class="o">.</span><span class="n">size</span><span class="p">:]</span> <span class="o">*=</span> <span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span><span class="s">&quot;{0} is not a valid fade option. Use either </span><span class="se">\&quot;</span><span class="s">in</span><span class="se">\&quot;</span><span class="s"> or &quot;</span>
<span class="s">&quot;</span><span class="se">\&quot;</span><span class="s">out</span><span class="se">\&quot;</span><span class="s">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">mode</span><span class="p">))</span>
@@ -1127,15 +1127,13 @@ div.nboutput > :nth-child(2).stderr {
<span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analyses</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
<span class="n">frames</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">read_grain</span>
<span class="c"># Create the analysis objects for analyses that have been specified in</span>
<span class="c"># the analyses member variable.</span>
<span class="k">for</span> <span class="n">analysis</span> <span class="ow">in</span> <span class="n">analysis_object_list</span><span class="p">:</span>
<span class="k">if</span> <span class="n">analysis</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">available_analyses</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analyses</span><span class="p">[</span><span class="n">analysis</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">analysis</span><span class="o">.</span><span class="n">analysis_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">analysis_storage</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analysis_storage</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="n">gc</span><span class="o">.</span><span class="n">collect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">analyses</span><span class="p">[</span><span class="n">analysis</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">analysis</span><span class="o">.</span><span class="n">analysis_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">frames</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">analysis_storage</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">create_analysis_group</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">analysis_file</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
+109 -51
View File
@@ -601,11 +601,25 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">length</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">samps_to_ms</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">frames</span><span class="p">)</span>
<span class="n">hop_size</span> <span class="o">=</span> <span class="n">grain_length</span> <span class="o">/</span> <span class="n">overlap</span>
<span class="n">grain_indexes</span><span class="p">[</span><span class="n">ind</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">length</span> <span class="o">/</span> <span class="n">hop_size</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="n">grain_indexes</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">cumsum</span><span class="p">(</span><span class="n">grain_indexes</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">])</span>
<span class="n">grain_indexes</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">cumsum</span><span class="p">(</span><span class="n">grain_indexes</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
<span class="n">grain_indexes</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">grain_indexes</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">grain_indexes</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">grain_indexes</span>
<span class="k">def</span> <span class="nf">kdtree_matcher</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">grain_size</span><span class="p">,</span> <span class="n">overlap</span><span class="p">):</span>
<span class="n">invalid_inds</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target_db</span><span class="o">.</span><span class="n">analysed_audio</span><span class="p">):</span>
<span class="n">entry</span><span class="o">.</span><span class="n">generate_grain_times</span><span class="p">(</span><span class="n">grain_size</span><span class="p">,</span> <span class="n">overlap</span><span class="p">,</span> <span class="n">save_times</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">entry</span><span class="o">.</span><span class="n">times</span><span class="o">.</span><span class="n">size</span><span class="p">:</span>
<span class="n">invalid_inds</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">invalid_inds</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_db</span><span class="o">.</span><span class="n">analysed_audio</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">invalid_inds</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">entry</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">source_db</span><span class="o">.</span><span class="n">analysed_audio</span><span class="p">):</span>
<span class="n">entry</span><span class="o">.</span><span class="n">generate_grain_times</span><span class="p">(</span><span class="n">grain_size</span><span class="p">,</span> <span class="n">overlap</span><span class="p">,</span> <span class="n">save_times</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">entry</span><span class="o">.</span><span class="n">times</span><span class="o">.</span><span class="n">size</span><span class="p">:</span>
<span class="n">invalid_inds</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">invalid_inds</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">source_db</span><span class="o">.</span><span class="n">analysed_audio</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="c"># Count grains of the source database</span>
<span class="n">source_sample_indexes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">count_grains</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">source_db</span><span class="p">,</span> <span class="n">grain_size</span><span class="p">,</span> <span class="n">overlap</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
@@ -621,6 +635,10 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">else</span><span class="p">:</span>
<span class="n">weightings</span> <span class="o">=</span> <span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="mf">1.</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">matcher_analyses</span><span class="p">}</span>
<span class="c"># Create an imputer object for handeling Nan values.</span>
<span class="n">imp</span> <span class="o">=</span> <span class="n">Imputer</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">strategy</span><span class="o">=</span><span class="s">&#39;median&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">tind</span><span class="p">,</span> <span class="n">target_entry</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">target_db</span><span class="o">.</span><span class="n">analysed_audio</span><span class="p">):</span>
<span class="c"># Check if match data already exists and use it rather than</span>
<span class="c"># regenerating if it does.</span>
@@ -631,7 +649,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">continue</span>
<span class="c"># Create an array of grain times for target sample</span>
<span class="n">target_times</span> <span class="o">=</span> <span class="n">target_entry</span><span class="o">.</span><span class="n">generate_grain_times</span><span class="p">(</span><span class="n">grain_size</span><span class="p">,</span> <span class="n">overlap</span><span class="p">,</span> <span class="n">save_times</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">target_times</span> <span class="o">=</span> <span class="n">target_entry</span><span class="o">.</span><span class="n">times</span>
<span class="n">x_size</span> <span class="o">=</span> <span class="n">target_times</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">match_indexes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">((</span><span class="n">x_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">match_quantity</span><span class="p">))</span>
<span class="n">match_vals</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">((</span><span class="n">x_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">match_quantity</span><span class="p">))</span>
@@ -644,28 +662,41 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">analysis_formatting</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">analysis_dict</span><span class="p">[</span><span class="n">analysis</span><span class="p">]</span>
<span class="n">target_data</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="n">target_entry</span><span class="o">.</span><span class="n">analysis_data_grains</span><span class="p">(</span><span class="n">target_times</span><span class="p">,</span> <span class="n">analysis</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="n">analysis_formatting</span><span class="p">)</span>
<span class="n">target_data</span> <span class="o">*=</span> <span class="n">weightings</span><span class="p">[</span><span class="n">analysis</span><span class="p">]</span>
<span class="n">all_target_analyses</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">target_data</span>
<span class="n">imp</span> <span class="o">=</span> <span class="n">Imputer</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">nan_columns</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">all_target_analyses</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">all_target_analyses</span><span class="p">[:,</span> <span class="n">nan_columns</span><span class="p">]</span> <span class="o">=</span> <span class="mf">0.</span>
<span class="c"># Impute values for Nans</span>
<span class="n">all_target_analyses</span> <span class="o">=</span> <span class="n">imp</span><span class="o">.</span><span class="n">fit_transform</span><span class="p">(</span><span class="n">all_target_analyses</span><span class="p">)</span>
<span class="c"># all_target_analyses[np.isnan(all_target_analyses)] = np.inf</span>
<span class="k">for</span> <span class="n">sind</span><span class="p">,</span> <span class="n">source_entry</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">source_db</span><span class="o">.</span><span class="n">analysed_audio</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;K-d Tree Matching: {0} to {1}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">source_entry</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">target_entry</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Create an array of grain times for source sample</span>
<span class="n">source_times</span> <span class="o">=</span> <span class="n">source_entry</span><span class="o">.</span><span class="n">generate_grain_times</span><span class="p">(</span><span class="n">grain_size</span><span class="p">,</span> <span class="n">overlap</span><span class="p">,</span> <span class="n">save_times</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">source_times</span> <span class="o">=</span> <span class="n">source_entry</span><span class="o">.</span><span class="n">times</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">source_times</span><span class="o">.</span><span class="n">size</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">all_source_analyses</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">matcher_analyses</span><span class="p">),</span> <span class="n">source_times</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">analysis</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">matcher_analyses</span><span class="p">):</span>
<span class="n">analysis_formatting</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">analysis_dict</span><span class="p">[</span><span class="n">analysis</span><span class="p">]</span>
<span class="n">source_data</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="n">source_entry</span><span class="o">.</span><span class="n">analysis_data_grains</span><span class="p">(</span><span class="n">source_times</span><span class="p">,</span> <span class="n">analysis</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="n">analysis_formatting</span><span class="p">)</span>
<span class="n">source_data</span> <span class="o">*=</span> <span class="n">weightings</span><span class="p">[</span><span class="n">analysis</span><span class="p">]</span>
<span class="n">all_source_analyses</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">source_data</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;K-d Tree Matching: {0} to {1}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">source_entry</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">target_entry</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
<span class="c"># Impute values for Nans</span>
<span class="n">nan_columns</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">all_source_analyses</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">all_source_analyses</span><span class="p">[:,</span> <span class="n">nan_columns</span><span class="p">]</span> <span class="o">=</span> <span class="mf">0.</span>
<span class="n">all_source_analyses</span> <span class="o">=</span> <span class="n">imp</span><span class="o">.</span><span class="n">fit_transform</span><span class="p">(</span><span class="n">all_source_analyses</span><span class="p">)</span>
<span class="c"># all_source_analyses[np.isnan(all_source_analyses)] = np.inf</span>
<span class="n">source_tree</span> <span class="o">=</span> <span class="n">spatial</span><span class="o">.</span><span class="n">cKDTree</span><span class="p">(</span><span class="n">all_source_analyses</span><span class="o">.</span><span class="n">T</span><span class="p">,</span> <span class="n">leafsize</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="n">results_vals</span><span class="p">,</span> <span class="n">results_inds</span> <span class="o">=</span> <span class="n">source_tree</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">all_target_analyses</span><span class="o">.</span><span class="n">T</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">match_quantity</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
@@ -929,12 +960,22 @@ div.nboutput > :nth-child(2).stderr {
<span class="sd"> grain, a dimension for each match of said grain and a dimension</span>
<span class="sd"> containing database sample index and the sample&#39;s grain index.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c"># source_sample_indexes = source_sample_indexes[source_sample_indexes[:, 1] != 0.]</span>
<span class="n">mi_shape</span> <span class="o">=</span> <span class="n">match_indexes</span><span class="o">.</span><span class="n">shape</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">match_indexes</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
<span class="c"># Find indexes within the range of each source sample index.</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">logical_and</span><span class="p">(</span>
<span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">&gt;=</span><span class="n">source_sample_indexes</span><span class="p">[:,</span><span class="mi">0</span><span class="p">],</span>
<span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">&lt;=</span><span class="n">source_sample_indexes</span><span class="p">[:,</span><span class="mi">1</span><span class="p">]</span>
<span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;Not all match indexes have a corresponding sample index. This shouldn&#39;t happen...</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Check that all database path arguments are correct then try re-running with the --rematch and --reanalyse flags.</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;If this does&#39;nt work, delete the audio and data directories in all databases and try again...&quot;</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">mi_shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">mi_shape</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">x</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
@@ -964,10 +1005,10 @@ div.nboutput > :nth-child(2).stderr {
<span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&quot;config&quot;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">enforce_rms_bool</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">synthesizer</span><span class="p">[</span><span class="s">&quot;enforce_rms&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">enforce_intensity_bool</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">synthesizer</span><span class="p">[</span><span class="s">&quot;enforce_intensity&quot;</span><span class="p">]</span>
<span class="c"># Key word arguments overwrite config file.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">enforce_rms_bool</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&quot;enforce_rms&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_rms_bool</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_rms_bool</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&quot;rms&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_db</span><span class="o">.</span><span class="n">analysis_list</span> <span class="ow">or</span> <span class="s">&quot;rms&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">match_db</span><span class="o">.</span><span class="n">analysis_list</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">enforce_intensity_bool</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s">&quot;enforce_intensity&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_intensity_bool</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_intensity_bool</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&quot;rms&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_db</span><span class="o">.</span><span class="n">analysis_list</span> <span class="ow">or</span> <span class="s">&quot;rms&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">match_db</span><span class="o">.</span><span class="n">analysis_list</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&quot;BLARGHHH&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">enforce_f0_bool</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">synthesizer</span><span class="p">[</span><span class="s">&quot;enforce_f0&quot;</span><span class="p">]</span>
@@ -976,7 +1017,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_f0_bool</span> <span class="ow">and</span> <span class="p">(</span><span class="s">&quot;f0&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_db</span><span class="o">.</span><span class="n">analysis_list</span> <span class="ow">or</span> <span class="s">&quot;f0&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">match_db</span><span class="o">.</span><span class="n">analysis_list</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&quot;F0 enforcement cannot be enabled if both databases do not have F0 analyses.&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_rms</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_intensity</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_db</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;Target database must be provided if rms or F0 enforcement is enabled.&quot;</span><span class="p">)</span>
@@ -1015,8 +1056,8 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">channels</span><span class="o">=</span><span class="n">output_config</span><span class="p">[</span><span class="s">&quot;channels&quot;</span><span class="p">]</span>
<span class="p">)</span> <span class="k">as</span> <span class="n">output</span><span class="p">:</span>
<span class="n">hop_size</span> <span class="o">=</span> <span class="p">(</span><span class="n">grain_size</span> <span class="o">/</span> <span class="n">overlap</span><span class="p">)</span> <span class="o">*</span> <span class="n">output</span><span class="o">.</span><span class="n">samplerate</span><span class="o">/</span><span class="mi">1000</span>
<span class="n">_grain_size</span> <span class="o">*=</span> <span class="n">output</span><span class="o">.</span><span class="n">samplerate</span> <span class="o">/</span> <span class="mi">1000</span>
<span class="n">output_frames</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">_grain_size</span> <span class="o">+</span> <span class="p">(</span><span class="n">hop_size</span><span class="o">*</span><span class="nb">len</span><span class="p">(</span><span class="n">grain_matches</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">))</span>
<span class="n">_grain_size</span> <span class="o">*=</span> <span class="nb">int</span><span class="p">(</span><span class="n">output</span><span class="o">.</span><span class="n">samplerate</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">)</span>
<span class="n">output_frames</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">_grain_size</span><span class="o">*</span><span class="mi">2</span> <span class="o">+</span> <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">hop_size</span><span class="o">*</span><span class="nb">len</span><span class="p">(</span><span class="n">grain_matches</span><span class="p">))))</span>
<span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">target_grain_ind</span><span class="p">,</span> <span class="n">matches</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">grain_matches</span><span class="p">):</span>
<span class="c"># If there are multiple matches, choose a match at random</span>
@@ -1024,12 +1065,27 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">match_index</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="n">matches</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">match_db_ind</span><span class="p">,</span> <span class="n">match_grain_ind</span> <span class="o">=</span> <span class="n">matches</span><span class="p">[</span><span class="n">match_index</span><span class="p">]</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">match_db</span><span class="o">.</span><span class="n">analysed_audio</span><span class="p">[</span><span class="n">match_db_ind</span><span class="p">]</span> <span class="k">as</span> <span class="n">match_sample</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">&quot;Synthesizing grain:</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Source sample: {0}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Source grain index: {1}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Target output: {2}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Target grain index: {3} out of {4}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">match_sample</span><span class="p">,</span>
<span class="n">match_grain_ind</span><span class="p">,</span>
<span class="n">output_name</span><span class="p">,</span>
<span class="n">target_grain_ind</span><span class="p">,</span>
<span class="nb">len</span><span class="p">(</span><span class="n">grain_matches</span><span class="p">)</span>
<span class="p">))</span>
<span class="n">match_sample</span><span class="o">.</span><span class="n">generate_grain_times</span><span class="p">(</span><span class="n">match_grain_size</span><span class="p">,</span> <span class="n">match_overlap</span><span class="p">,</span> <span class="n">save_times</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="c"># TODO: Make proper fix for grain index offset of 1</span>
<span class="n">match_grain</span> <span class="o">=</span> <span class="n">match_sample</span><span class="p">[</span><span class="n">match_grain_ind</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">match_grain</span> <span class="o">=</span> <span class="n">match_sample</span><span class="p">[</span><span class="n">match_grain_ind</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">pdb</span><span class="o">.</span><span class="n">set_trace</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_rms_bool</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_intensity_bool</span><span class="p">:</span>
<span class="c"># Get the target sample from the database</span>
<span class="n">target_sample</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_db</span><span class="p">[</span><span class="n">job_ind</span><span class="p">]</span>
@@ -1037,7 +1093,7 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># indexing.</span>
<span class="n">target_sample</span><span class="o">.</span><span class="n">generate_grain_times</span><span class="p">(</span><span class="n">match_grain_size</span><span class="p">,</span> <span class="n">match_overlap</span><span class="p">,</span> <span class="n">save_times</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">match_grain</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_rms</span><span class="p">(</span><span class="n">match_grain</span><span class="p">,</span> <span class="n">match_sample</span><span class="p">,</span> <span class="n">match_grain_ind</span><span class="p">,</span> <span class="n">target_sample</span><span class="p">,</span> <span class="n">target_grain_ind</span><span class="p">)</span>
<span class="n">match_grain</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_intensity</span><span class="p">(</span><span class="n">match_grain</span><span class="p">,</span> <span class="n">match_sample</span><span class="p">,</span> <span class="n">match_grain_ind</span><span class="p">,</span> <span class="n">target_sample</span><span class="p">,</span> <span class="n">target_grain_ind</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_f0_bool</span><span class="p">:</span>
<span class="c"># Get the target sample from the database</span>
@@ -1049,8 +1105,12 @@ div.nboutput > :nth-child(2).stderr {
<span class="n">match_grain</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_pitch</span><span class="p">(</span><span class="n">match_grain</span><span class="p">,</span> <span class="n">match_sample</span><span class="p">,</span> <span class="n">match_grain_ind</span><span class="p">,</span> <span class="n">target_sample</span><span class="p">,</span> <span class="n">target_grain_ind</span><span class="p">)</span>
<span class="c"># Apply hanning window to grain</span>
<span class="n">match_grain</span> <span class="o">*=</span> <span class="n">np</span><span class="o">.</span><span class="n">hanning</span><span class="p">(</span><span class="n">match_grain</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>
<span class="n">output_frames</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">match_grain</span><span class="o">.</span><span class="n">size</span><span class="p">]</span> <span class="o">+=</span> <span class="n">match_grain</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">output_frames</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">match_grain</span><span class="o">.</span><span class="n">size</span><span class="p">]</span> <span class="o">+=</span> <span class="n">match_grain</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">pdb</span><span class="o">.</span><span class="n">set_trace</span><span class="p">()</span>
<span class="n">offset</span> <span class="o">+=</span> <span class="n">hop_size</span>
<span class="c"># If output normalization is active, normalize output.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">synthesizer</span><span class="p">[</span><span class="s">&quot;normalize&quot;</span><span class="p">]:</span>
@@ -1068,6 +1128,10 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># TODO: Make proper fix for grain index offset of 1</span>
<span class="n">target_times</span> <span class="o">=</span> <span class="n">target_sample</span><span class="o">.</span><span class="n">times</span><span class="p">[</span><span class="n">target_grain_ind</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="c"># Get mean harmonic ratio of f0 frames in time range specified.</span>
<span class="n">target_harmonic_ratio</span> <span class="o">=</span> <span class="n">target_sample</span><span class="o">.</span><span class="n">analysis_data_grains</span><span class="p">(</span><span class="n">target_times</span><span class="p">,</span> <span class="s">&quot;harm_ratio&quot;</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s">&quot;mean&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="c"># Get mean of f0 frames in time range specified.</span>
<span class="n">target_f0</span> <span class="o">=</span> <span class="n">target_sample</span><span class="o">.</span><span class="n">analysis_data_grains</span><span class="p">(</span><span class="n">target_times</span><span class="p">,</span> <span class="s">&quot;f0&quot;</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s">&quot;median&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
@@ -1075,55 +1139,48 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># TODO: Make proper fix for grain index offset of 1</span>
<span class="n">source_times</span> <span class="o">=</span> <span class="n">source_sample</span><span class="o">.</span><span class="n">times</span><span class="p">[</span><span class="n">source_grain_ind</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="c"># Get mean harmonic ratio of f0 frames in time range specified.</span>
<span class="n">source_harmonic_ratio</span> <span class="o">=</span> <span class="n">source_sample</span><span class="o">.</span><span class="n">analysis_data_grains</span><span class="p">(</span><span class="n">source_times</span><span class="p">,</span> <span class="s">&quot;harm_ratio&quot;</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s">&quot;mean&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">hr_array</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">source_harmonic_ratio</span><span class="p">,</span> <span class="n">target_harmonic_ratio</span><span class="p">])</span>
<span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">hr_array</span><span class="p">)):</span>
<span class="k">return</span> <span class="n">grain</span><span class="o">*</span><span class="mi">0</span>
<span class="c"># Get mean of f0 frames in time range specified.</span>
<span class="n">source_f0</span> <span class="o">=</span> <span class="n">source_sample</span><span class="o">.</span><span class="n">analysis_data_grains</span><span class="p">(</span><span class="n">source_times</span><span class="p">,</span> <span class="s">&quot;f0&quot;</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s">&quot;median&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">ratio_difference</span> <span class="o">=</span> <span class="n">target_f0</span> <span class="o">/</span> <span class="n">source_f0</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">ratio_difference</span><span class="p">):</span>
<span class="k">return</span> <span class="n">grain</span>
<span class="k">return</span> <span class="n">grain</span><span class="o">*</span><span class="mi">0</span>
<span class="c"># If the ratio difference is within the limits</span>
<span class="n">ratio_limit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">synthesizer</span><span class="p">[</span><span class="s">&quot;enf_f0_ratio_limit&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="n">ratio_difference</span> <span class="o">&gt;</span> <span class="n">ratio_limit</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&quot;Grain f0 ratio too large({0}), enforcing f0 at limit ({1})</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Source sample: {2}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Source grain index: {3}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Target sample: {4}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Target grain index: {5}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&quot;Grain f0 ratio too large({0}), enforcing f0 at limit ({1})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">ratio_difference</span><span class="p">,</span>
<span class="n">ratio_limit</span><span class="p">,</span>
<span class="n">source_sample</span><span class="p">,</span>
<span class="n">source_grain_ind</span><span class="p">,</span>
<span class="n">target_sample</span><span class="p">,</span>
<span class="n">target_grain_ind</span>
<span class="p">))</span>
<span class="n">ratio_difference</span> <span class="o">=</span> <span class="n">ratio_limit</span>
<span class="k">elif</span> <span class="n">ratio_difference</span> <span class="o">&lt;</span> <span class="mf">1.</span><span class="o">/</span><span class="n">ratio_limit</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&quot;Grain f0 ratio too large ({0}), enforcing f0 at limit ({1})</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Source sample: {2}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Source grain index: {3}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Target sample: {4}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Target grain index: {5}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&quot;Grain f0 ratio too large ({0}), enforcing f0 at limit ({1})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">ratio_difference</span><span class="p">,</span>
<span class="mf">1.</span><span class="o">/</span><span class="n">ratio_limit</span><span class="p">,</span>
<span class="n">source_sample</span><span class="p">,</span>
<span class="n">source_grain_ind</span><span class="p">,</span>
<span class="n">target_sample</span><span class="p">,</span>
<span class="n">target_grain_ind</span>
<span class="p">))</span>
<span class="n">ratio_difference</span> <span class="o">=</span> <span class="mf">1.</span><span class="o">/</span><span class="n">ratio_limit</span>
<span class="n">grain</span> <span class="o">=</span> <span class="n">pitch_shift</span><span class="o">.</span><span class="n">shift</span><span class="p">(</span><span class="n">grain</span><span class="p">,</span> <span class="n">ratio_difference</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ratio_difference</span> <span class="o">&gt;</span> <span class="n">ratio_limit</span> <span class="ow">or</span> <span class="n">ratio_difference</span> <span class="o">&lt;</span> <span class="mf">1.</span><span class="o">/</span><span class="n">ratio_limit</span><span class="p">:</span>
<span class="n">grain</span> <span class="o">*=</span> <span class="mi">0</span>
<span class="k">return</span> <span class="n">grain</span>
<span class="k">def</span> <span class="nf">enforce_rms</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">grain</span><span class="p">,</span> <span class="n">source_sample</span><span class="p">,</span> <span class="n">source_grain_ind</span><span class="p">,</span> <span class="n">target_sample</span><span class="p">,</span> <span class="n">target_grain_ind</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">enforce_intensity</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">grain</span><span class="p">,</span> <span class="n">source_sample</span><span class="p">,</span> <span class="n">source_grain_ind</span><span class="p">,</span> <span class="n">target_sample</span><span class="p">,</span> <span class="n">target_grain_ind</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Scales the amplitude of the grain by the difference between it&#39;s rms and the rms of the grain specified.</span>
<span class="sd"> Scales the amplitude of the grain by the difference between it&#39;s intensity and the intensity of the grain specified.</span>
<span class="sd"> This method will fail if either AnalysedAudioFile object does not have an rms analysis.</span>
<span class="sd"> This method will fail if either AnalysedAudioFile object does not have any intensity analyses.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c"># Get grain start and finish range to retreive analysis frames from.</span>
@@ -1132,6 +1189,9 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># Get mean of RMS frames in time range specified.</span>
<span class="n">target_rms</span> <span class="o">=</span> <span class="n">target_sample</span><span class="o">.</span><span class="n">analysis_data_grains</span><span class="p">(</span><span class="n">target_times</span><span class="p">,</span> <span class="s">&quot;rms&quot;</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s">&quot;mean&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">target_peak</span> <span class="o">=</span> <span class="n">target_sample</span><span class="o">.</span><span class="n">analysis_data_grains</span><span class="p">(</span><span class="n">target_times</span><span class="p">,</span> <span class="s">&quot;peak&quot;</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s">&quot;mean&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">target_intensity_value</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">([</span><span class="n">target_rms</span><span class="p">,</span> <span class="n">target_peak</span><span class="p">])</span>
<span class="c"># Get grain start and finish range to retreive analysis frames from.</span>
<span class="c"># TODO: Make proper fix for grain index offset of 1</span>
@@ -1139,30 +1199,28 @@ div.nboutput > :nth-child(2).stderr {
<span class="c"># Get mean of RMS frames in time range specified.</span>
<span class="n">source_rms</span> <span class="o">=</span> <span class="n">source_sample</span><span class="o">.</span><span class="n">analysis_data_grains</span><span class="p">(</span><span class="n">source_times</span><span class="p">,</span> <span class="s">&quot;rms&quot;</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s">&quot;mean&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">source_peak</span> <span class="o">=</span> <span class="n">source_sample</span><span class="o">.</span><span class="n">analysis_data_grains</span><span class="p">(</span><span class="n">source_times</span><span class="p">,</span> <span class="s">&quot;peak&quot;</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s">&quot;mean&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">source_intensity_value</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">([</span><span class="n">source_rms</span><span class="p">,</span> <span class="n">source_peak</span><span class="p">])</span>
<span class="n">ratio_difference</span> <span class="o">=</span> <span class="n">target_intensity_value</span> <span class="o">/</span> <span class="n">source_intensity_value</span>
<span class="n">ratio_difference</span> <span class="o">=</span> <span class="n">target_rms</span> <span class="o">/</span> <span class="n">source_rms</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">ratio_difference</span><span class="p">):</span>
<span class="k">return</span> <span class="n">grain</span>
<span class="c"># If the ratio difference is within the limits</span>
<span class="n">ratio_limit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">synthesizer</span><span class="p">[</span><span class="s">&quot;enf_rms_ratio_limit&quot;</span><span class="p">]</span>
<span class="n">ratio_limit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">synthesizer</span><span class="p">[</span><span class="s">&quot;enf_intensity_ratio_limit&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="n">ratio_difference</span> <span class="o">&gt;</span> <span class="n">ratio_limit</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">&quot;Grain RMS ratio too large({0}), enforcing RMS at limit ({1})</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Source sample: {2}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Source grain index: {3}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Target sample: {4}</span><span class="se">\n</span><span class="s">&quot;</span>
<span class="s">&quot;Target grain index: {5}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">ratio_difference</span><span class="p">,</span>
<span class="n">ratio_limit</span><span class="p">,</span>
<span class="n">source_sample</span><span class="p">,</span>
<span class="n">source_grain_ind</span><span class="p">,</span>
<span class="n">target_sample</span><span class="p">,</span>
<span class="n">target_grain_ind</span>
<span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
<span class="s">&quot;Grain RMS ratio too large({0}), enforcing RMS at limit ({1})</span><span class="se">\n</span><span class="s">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">ratio_difference</span><span class="p">,</span>
<span class="n">ratio_limit</span><span class="p">,</span>
<span class="p">))</span>
<span class="n">ratio_difference</span> <span class="o">=</span> <span class="n">ratio_limit</span>
<span class="n">grain</span> <span class="o">*=</span> <span class="n">ratio_difference</span>
<span class="k">return</span> <span class="n">grain</span>
<span class="k">def</span> <span class="nf">swap_databases</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
BIN
View File
Binary file not shown.
+1 -1
View File
File diff suppressed because one or more lines are too long
+4
View File
@@ -1,5 +1,9 @@
API
===
This section contains the details of the underlying code used to create the
concatenator script. This is included so that developer may use the library for
further work in this area and aims to provide a complete description of
functions and class structures in an easy to use format.
-------------------
AudioFile Class
+40 -34
View File
@@ -2,6 +2,11 @@
Audio Descriptor Definitions
============================
This section describes the audio descriptors used for analysing chacteristics
of the audio files. Each descriptor is used for measuring a specific
characteristic and multiple descriptors are combined to match grains based on
the amalgamation of these measurements. For example, Using the F0 and RMS
descriptors would match audio based on it's pitch and energy.
Centroid
~~~~~~~~~~~~~~~~~
@@ -10,7 +15,7 @@ used to determine the central point of a signal's amplitude and is calculated
as:
.. math::
C(n) = \frac{\sum_{i=i_s(n)}^{i_e(n)}(i-i_s(n)) \cdot x(i)}{\sum_{i=i_s(n)}^{i_e(n)} \cdot x(n)}
C(n) = \frac{\sum_{i=i_s(n)}^{i_e(n)}(i-i_s(n)) \cdot x(i)}{\sum_{i=i_s(n)}^{i_e(n)} \cdot x(n)}.
Ref: :cite:`lerch2012itaca`
@@ -29,10 +34,10 @@ defined as:
.. math::
R_n(m) = \sum_{i=i_s(n)}^{i_e(n)} x(i) x(i-m)
Then normalizing:
then normalizing:
.. math::
\Gamma_n(m) = \frac{R_n(m)}{\sqrt{\sum_{i=i_s(n)}^{i_e(n)}x(i)^2 \sum_{i=i_s(n)}^{i_e(n)}x(i-m)^2}}
\Gamma_n(m) = \frac{R_n(m)}{\sqrt{\sum_{i=i_s(n)}^{i_e(n)}x(i)^2 \sum_{i=i_s(n)}^{i_e(n)}x(i-m)^2}}.
The fundamental period of the signal is then calculated as the point between
:math:`T_{min}` and :math:`T_{max}` at which the correlated signal most closely matches the
@@ -40,11 +45,11 @@ original. :math:`T_{min}` and :math:`T_{max}` are defined as the minimum and max
the fundamental period.
.. math::
y = arg\,max_{T_{min} \leq m \leq T_{max}} \{\Gamma_i(m)\}
y = arg\,max_{T_{min} \leq m \leq T_{max}} \{\Gamma_i(m)\}.
In order to improve the accuracy of peak detection, parabolic interpolation is
used to estimate the peak's location with greater accuracy by using the peak
correlation and it's two closes neighbour's values to estimate the fractional
correlation and it's two closest neighbour's values to estimate the fractional
peak value.
The method for parabolic interpolation is defined as:
@@ -61,7 +66,7 @@ Ref: :cite:`smith2011sasp`
From this, the fundamental period the frequency is then calculated as:
.. math::
f_0^n = \frac{1}{T_0^n}
f_0^n = \frac{1}{T_0^n}.
Ref: :cite:`itaa2014`
@@ -73,25 +78,25 @@ Fourier Transform for windows of a signal. The full description of this
transform is outside the scope of this project, however it should be understood
that this analysis provides a description of the spectral content of a windowed
signal. By applying the transform, a number of bins of size :math:`K` are
calculated that detail the sine and cosine apmlitudes required to reconstruct
calculated that detail the sine and cosine amplitudes required to reconstruct
the signal. The calculation of the STFT is defined as:
.. math::
X(k,n) = \sum_{i=i_s(n)}^{i_e(n)} x(i) \exp{\Big(-jk \cdot (i -
i_s(n))\frac{2\pi}{K}\Big)}
i_s(n))\frac{2\pi}{K}\Big)}.
Ref: :cite:`lerch2012itaca`
Harmonic Ratio
~~~~~~~~~~~~~~
The harmonic ratio can be used to differentiate between noisy and periodic
signals. higher values suggest that the signal is more periodic (such as a sine
signals. Higher values suggest that the signal is more periodic (such as a sine
wave) and lower values represent less periodicity. This can be used as a form
of confidence measure in determining the validity of F0 values. it is
of confidence measure in determining the validity of F0 values. It is
calculated as part of the F0 estimation algorithm as:
.. math::
HR(n) = max_{T_{min} \leq m \leq T_{max}}{\{T_n(m)\}}
HR(n) = max_{T_{min} \leq m \leq T_{max}}{\{T_n(m)\}}.
Ref: :cite:`lerch2012itaca`
@@ -102,26 +107,27 @@ values indicate a flatter distribution and positive values indicate a more
"peaky" distribution. Kurtosis is calculated as:
.. math::
TK(n)=\frac{1}{\sigma_x^4(n) \cdot K}\sum_{i=i_s(n)}^{i_e(n)}\Big(x(i)-\mu_x(n)\Big)^4-3
TK(n)=\frac{1}{\sigma_x^4(n) \cdot K}\sum_{i=i_s(n)}^{i_e(n)}\Big(x(i)-\mu_x(n)\Big)^4-3.
Ref: :cite:`lerch2012itaca`
Peak Amplitude
~~~~~~~~~~~~~~
Peak amplitude measures the highest peak in the absoulte signal. it is
Peak amplitude measures the highest peak in the absolute signal. It is
calculated as:
.. math::
P(n) = \max_{i_s(n) \leq i \leq i_e(n)}\{\left|x(i)\right|\}
P(n) = \max_{i_s(n) \leq i \leq i_e(n)}\{\left|x(i)\right|\}.
RMS
~~~
The perceived loudness of a signal is an important feature as it can be related
to the dynamics of the signal. RMS is used as a measure of sound intensity and
is used for distinguishing between loud and quiet audio. It is calculated as:
is used for distinguishing between loud and quiet audio. It is calculated as,
where $K$ is the total number of samples:
.. math::
RMS(n) = \sqrt{\frac{1}{K} \sum_{i=i_s(n)}^{i_e(n)} x(i)^2}
RMS(n) = \sqrt{\frac{1}{K} \sum_{i=i_s(n)}^{i_e(n)} x(i)^2}.
Other methods that take the human perception of loudness into account may
provide more perceptually relevant results. However the RMS measurement
@@ -131,13 +137,13 @@ Ref: :cite:`lerch2012itaca`
Spectral Centroid
~~~~~~~~~~~~~~~~~
The spectral centroid measure the center of gravity accross frequency bins to
determine the central point accross the spectral content of the frame. High
value sindicate that the spectral content is centered in higher frequencies and
lower value indicate a lower center. The spectral centroid is calculated as:
The spectral centroid measure the centre of gravity across frequency bins to
determine the central point across the spectral content of the frame. High
values indicate that the spectral content is centred in higher frequencies and
lower value indicate a lower centre. The spectral centroid is calculated as:
.. math::
SC(n) = \frac{\sum_{k=0}^{K/2-1} k \cdot | X(k,n) | ^2}{\sum_{k=0}^{K/2-1} | X(k,n) | ^2}
SC(n) = \frac{\sum_{k=0}^{K/2-1} k \cdot | X(k,n) | ^2}{\sum_{k=0}^{K/2-1} | X(k,n) | ^2}.
The result is the sum of magnitudes, weighted by their index, normalized by the
unweighted sum.
@@ -146,14 +152,14 @@ Ref: :cite:`lerch2012itaca`
Spectral Crest Factor
~~~~~~~~~~~~~~~~~~~~~
The spectral crest factor can be used as a mesure of tonalness of the signal.
it is calculated by taking the maximum magnitude and dividing by the sum of
The spectral crest factor can be used as a measure of tonalness of the signal.
It is calculated by taking the maximum magnitude and dividing by the sum of
magnitudes.
This differntiates between flat spectrums and sinusoidal spectrums. (low values
represnting the former and high values representing the latter.)
This differentiates between flat spectrums and sinusoidal spectrums. (low values
representing the former and high values representing the latter.)
.. math::
SCF = \frac{ \max_{0 \leq k \leq K/2-1} \{| X(k,n) | \}}{\sum_{k=0}^{K/2-1} | X(k,n) | }
SCF = \frac{ \max_{0 \leq k \leq K/2-1} \{| X(k,n) | \}}{\sum_{k=0}^{K/2-1} | X(k,n) | }.
Ref: :cite:`lerch2012itaca`
@@ -166,7 +172,7 @@ values that represent a more tonal signal. Spectral flatness is calculated as:
.. math::
TFl(n) = \frac{\sqrt[K/2]{\prod_{k=0}^{K/2-1} | X(k,n) | }}{2/K \cdot
\sum_{k=0}^{K/2-1} | X(k,n) | }
\sum_{k=0}^{K/2-1} | X(k,n) | }.
Ref: :cite:`lerch2012itaca`
@@ -175,11 +181,11 @@ Spectral Flux
Spectral flux is a measure of change between consecutive frames. It calculates
the average difference between frames to differentiate between adjacent frames
that are largely dissimilar (suggesting a non-stationary section of signal) and
similiar frames (that suggests a steady state signal). It is calculated as:
similar frames (that suggests a steady state signal). It is calculated as:
.. math::
SF(n) = \frac{\sqrt{\sum_{k=0}^{K/2-1} \Big( | X(k,n) | - | X(k,n-1) | \Big)^2
}}{K/2}
}}{K/2}.
Ref: :cite:`lerch2012itaca`
@@ -191,7 +197,7 @@ and is associated with perceptions of timbre. It is calculated as:
.. math::
SS(n) = \sqrt{\frac{\sum_{k=0}^{K/2-1} \Big(k-SC(n)\Big)^2 \cdot | X(k,n)
| ^2}{\sum_{k=0}^{K/2-1} | X(k,n) | ^2}}
| ^2}{\sum_{k=0}^{K/2-1} | X(k,n) | ^2}}.
Ref: :cite:`lerch2012itaca`
@@ -201,19 +207,19 @@ The variance of a signal measures it's spread around the signal's arithmetic
mean. It is used in the calculation of Kurtosis and is calculated as:
.. math::
\sigma_x^2 = \frac{1}{K} \sum_{i=i_s(n)}^{i_e(n)}(x(i) - \mu_x(n))^2
\sigma_x^2 = \frac{1}{K} \sum_{i=i_s(n)}^{i_e(n)}(x(i) - \mu_x(n))^2.
Ref: :cite:`lerch2012itaca`
Zero-Crossing
~~~~~~~~~~~~~
The zero-crossing rate counts the number of times a signal's value changes from
positive to negative in a frame. it is relevant to determining the noisiness of
a signal, as noisy signals will pass from positive to negative more frequenctly
positive to negative in a frame. It is relevant to determining the noisiness of
a signal, as noisy signals will pass from positive to negative more frequently
than period signals. It is calculated as:
.. math::
Z(n) = \frac{1}{2K} \sum_{i=i_s(n)}^{i_e(n)} | sgn[x(i)] - sgn[x(i-1)] |
Z(n) = \frac{1}{2K} \sum_{i=i_s(n)}^{i_e(n)} | sgn[x(i)] - sgn[x(i-1)] |
\text{Where the sgn function is defined as:}
+4
View File
@@ -1,6 +1,10 @@
API Usage Examples
==================
This section aims to give use case examples for the API. This shows how the
code can be used to create a python script similar to that of the concatenator
script.
WARNING: As examples use the same files, only one notebook can be run at a
time. Make sure one notebook has been closed and halted before starting the
next.
+6
View File
@@ -1,6 +1,12 @@
Installation
============
This section provides installation instructions for installing the concatenator
project on your system. There are alternative methods that will most likely
work for installing both the project and many of it's dependencies, however
the method shown below has been tested and is therefore the most reliable
method for installing this project.
Prerequesites
-------------
+1 -1
View File
@@ -13,7 +13,7 @@ To create the final output, there are three main operations to perform:
.. graphviz::
digraph a[center=True] {
digraph a {
"Database Analysis" -> "Grain Matching" -> "Output Synthesis";
}
+4 -2
View File
@@ -84,7 +84,7 @@ For this demonstration, the following file structure will be used:
|-- target.03.wav
`-- target.04.wav
A source database containing a small selection of trumpet samples (aquired from
A source database containing a small selection of trumpet samples (acquired from
http://theremin.music.uiowa.edu/MIS.html) will be used to match grains with 4
target sounds. This will produce 4 output files, one for each target sound.
@@ -417,7 +417,9 @@ concatenate.py Script Flags
--match_method Choose the algorithm to use when matching analyses. Available algorithms are:
Brute force: 'bruteforce'
Brute force: 'bruteforce' (BROKEN. The brute force
matcher no longer works with the current release of
this script. Use the K-d Tree Search.)
K-d Tree Search: 'kdtree'
+4 -2
View File
@@ -326,7 +326,7 @@ works by analysing overlapping segments of audio (known as grains) from both
`-- target.04.wav
</pre></div>
</div>
<p>A source database containing a small selection of trumpet samples (aquired from</p>
<p>A source database containing a small selection of trumpet samples (acquired from</p>
<p><a class="reference external" href="http://theremin.music.uiowa.edu/MIS.html">http://theremin.music.uiowa.edu/MIS.html</a>) will be used to match grains with 4
target sounds. This will produce 4 output files, one for each target sound.</p>
<p>The following command is used to to generate the output:</p>
@@ -652,7 +652,9 @@ databases.</td></tr>
<tr><td class="option-group">
<kbd><span class="option">--match_method</span></kbd></td>
<td><p class="first">Choose the algorithm to use when matching analyses. Available algorithms are:</p>
<p>Brute force: &#8216;bruteforce&#8217;</p>
<p>Brute force: &#8216;bruteforce&#8217; (BROKEN. The brute force
matcher no longer works with the current release of
this script. Use the K-d Tree Search.)</p>
<p class="last">K-d Tree Search: &#8216;kdtree&#8217;</p>
</td></tr>
<tr><td class="option-group">