bspeice.github.io/audio-compression-using-pca...

710 lines
6.8 MiB
HTML
Raw Permalink Normal View History

2016-11-01 16:19:21 -04:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
2018-01-16 20:28:29 -05:00
<meta name="description" content="Towards a new (and pretty poor) compression scheme¶I&#39;m going to be working with some audio data for a while as I get prepared for a term project this semester. I&#39;ll be working (with a partner) to ...">
2016-11-01 16:19:21 -04:00
<meta name="keywords" content="Digital Signal Processing, Machine Learning, PCA">
2018-01-16 20:28:29 -05:00
<link rel="icon" href="https://bspeice.github.io/favicon.ico">
2016-11-01 16:19:21 -04:00
<title>Audio Compression using PCA - Bradlee Speice</title>
<!-- Stylesheets -->
2018-01-16 20:28:29 -05:00
<link href="https://bspeice.github.io/theme/css/bootstrap.min.css" rel="stylesheet">
<link href="https://bspeice.github.io/theme/css/fonts.css" rel="stylesheet">
<link href="https://bspeice.github.io/theme/css/nest.css" rel="stylesheet">
<link href="https://bspeice.github.io/theme/css/pygment.css" rel="stylesheet">
2016-11-01 16:19:21 -04:00
<!-- /Stylesheets -->
<!-- RSS Feeds -->
2018-01-16 20:28:29 -05:00
<link href="https://bspeice.github.io/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Bradlee Speice Full Atom Feed" />
<link href="https://bspeice.github.io/feeds/blog.atom.xml" type="application/atom+xml" rel="alternate" title="Bradlee Speice Categories Atom Feed" />
2016-11-01 16:19:21 -04:00
<!-- /RSS Feeds -->
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
2018-01-16 20:28:29 -05:00
<!-- Google Analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-74711362-1', 'auto');
ga('send', 'pageview');
</script>
<!-- /Google Analytics -->
2016-11-01 16:19:21 -04:00
</head>
<body>
<!-- Header -->
<div class="header-container gradient">
<!-- Static navbar -->
<div class="container">
<div class="header-nav">
<div class="header-logo">
2018-01-16 20:28:29 -05:00
<a class="pull-left" href="https://bspeice.github.io/"><img class="mr20" src="https://bspeice.github.io/images/logo.svg" alt="logo">Bradlee Speice</a>
2016-11-01 16:19:21 -04:00
</div>
<div class="nav pull-right">
</div>
</div>
</div>
<!-- /Static navbar -->
<!-- Header -->
<!-- Header -->
<div class="container header-wrapper">
<div class="row">
<div class="col-lg-12">
<div class="header-content">
<h1 class="header-title">Audio Compression using PCA</h1>
2018-01-16 20:28:29 -05:00
<p class="header-date"> <a href="https://bspeice.github.io/author/bradlee-speice.html">Bradlee Speice</a>, Tue 01 November 2016, <a href="https://bspeice.github.io/category/blog.html">Blog</a></p>
2016-11-01 16:19:21 -04:00
<div class="header-underline"></div>
<div class="clearfix"></div>
<p class="pull-right header-tags">
<span class="glyphicon glyphicon-tags mr5" aria-hidden="true"></span>
2018-01-16 20:28:29 -05:00
<a href="https://bspeice.github.io/tag/digital-signal-processing.html">Digital Signal Processing</a>, <a href="https://bspeice.github.io/tag/machine-learning.html">Machine Learning</a>, <a href="https://bspeice.github.io/tag/pca.html">PCA</a> </p>
2016-11-01 16:19:21 -04:00
</div>
</div>
</div>
</div>
<!-- /Header -->
<!-- /Header -->
</div>
<!-- /Header -->
<!-- Content -->
<div class="container content">
2018-01-16 20:28:29 -05:00
<p>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Towards-a-new-(and-pretty-poor)-compression-scheme">Towards a new (and pretty poor) compression scheme<a class="anchor-link" href="#Towards-a-new-(and-pretty-poor)-compression-scheme">&#182;</a></h2><p>I'm going to be working with some audio data for a while as I get prepared for a term project this semester. I'll be working (with a partner) to design a system for separating voices from music. Given my total lack of experience with <a href="https://en.wikipedia.org/wiki/Digital_signal_processing">Digital Signal Processing</a> I figured that now was as good a time as ever to work on a couple of fun projects that would get me back up to speed.</p>
<p>The first project I want to work on: Designing a new compression scheme for audio data.</p>
<h2 id="A-Brief-Introduction-to-Audio-Compression">A Brief Introduction to Audio Compression<a class="anchor-link" href="#A-Brief-Introduction-to-Audio-Compression">&#182;</a></h2><p>Audio files when uncompressed (files ending with <code>.wav</code>) are huge. Like, 10.5 Megabytes per minute huge. Storage is cheap these days, but that's still an incredible amount of data that we don't really need. Instead, we'd like to compress that data so that it's not taking up so much space. There are broadly two ways to accomplish this:</p>
<ol>
<li><p>Lossless compression - Formats like <a href="https://en.wikipedia.org/wiki/FLAC">FLAC</a>, <a href="https://en.wikipedia.org/wiki/Apple_Lossless">ALAC</a>, and <a href="https://en.wikipedia.org/wiki/Monkey%27s_Audio">Monkey's Audio (.ape)</a> all go down this route. The idea is that when you compress and uncompress a file, you get exactly the same as what you started with.</p>
</li>
<li><p>Lossy compression - Formats like <a href="https://en.wikipedia.org/wiki/MP3">MP3</a>, <a href="https://en.wikipedia.org/wiki/Vorbis">Ogg</a>, and <a href="https://en.wikipedia.org/wiki/Advanced_Audio_Coding">AAC (<code>.m4a</code>)</a> are far more popular, but make a crucial tradeoff: We can reduce the file size even more during compression, but the decompressed file won't be the same.</p>
</li>
</ol>
<p>There is a fundamental tradeoff at stake: Using lossy compression sacrifices some of the integrity of the resulting file to save on storage space. Most people (I personally believe it's everybody) can't hear the difference, so this is an acceptable tradeoff. You have files that take up a 10<sup>th</sup> of the space, and nobody can tell there's a difference in audio quality.</p>
<h2 id="A-PCA-based-Compression-Scheme">A PCA-based Compression Scheme<a class="anchor-link" href="#A-PCA-based-Compression-Scheme">&#182;</a></h2><p>What I want to try out is a <a href="https://en.wikipedia.org/wiki/Principal_component_analysis">PCA</a> approach to encoding audio. The PCA technique comes from Machine Learning, where it is used for a process called <a href="https://en.wikipedia.org/wiki/Dimensionality_reduction">Dimensionality Reduction</a>. Put simply, the idea is the same as lossy compression: if we can find a way that represents the data well enough, we can save on space. There are a lot of theoretical concerns that lead me to believe this compression style will not end well, but I'm interested to try it nonetheless.</p>
<p>PCA works as follows: Given a dataset with a number of features, I find a way to approximate those original features using some "new features" that are statistically as close as possible to the original ones. This is comparable to a scheme like MP3: Given an original signal, I want to find a way of representing it that gets approximately close to what the original was. The difference is that PCA is designed for statistical data, and not signal data. But we won't let that stop us.</p>
<p>The idea is as follows: Given a signal, reshape it into 1024 columns by however many rows are needed (zero-padded if necessary). Run the PCA algorithm, and do dimensionality reduction with a couple different settings. The number of components I choose determines the quality: If I use 1024 components, I will essentially be using the original signal. If I use a smaller number of components, I start losing some of the data that was in the original file. This will give me an idea of whether it's possible to actually build an encoding scheme off of this, or whether I'm wasting my time.</p>
<h2 id="Running-the-Algorithm">Running the Algorithm<a class="anchor-link" href="#Running-the-Algorithm">&#182;</a></h2><p>The audio I will be using comes from the song <a href="https://brokeforfree.bandcamp.com/track/tabulasa">Tabulasa</a>, by <a href="https://brokeforfree.bandcamp.com/album/xxvii">Broke for Free</a>. I'll be loading in the audio signal to Python and using <a href="http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA">Scikit-Learn</a> to actually run the PCA algorithm.</p>
<p>We first need to convert the FLAC file I have to a WAV:</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In&nbsp;[1]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span class="o">!</span>ffmpeg -hide_banner -loglevel panic -i <span class="s2">&quot;Broke For Free/XXVII/01 Tabulasa.flac&quot;</span> <span class="s2">&quot;Tabulasa.wav&quot;</span> -c wav
</pre></div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Then, let's go ahead and load a small sample so you can hear what is going on.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In&nbsp;[2]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">IPython.display</span> <span class="k">import</span> <span class="n">Audio</span>
<span class="kn">from</span> <span class="nn">scipy.io</span> <span class="k">import</span> <span class="n">wavfile</span>
<span class="n">samplerate</span><span class="p">,</span> <span class="n">tabulasa</span> <span class="o">=</span> <span class="n">wavfile</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">&#39;Tabulasa.wav&#39;</span><span class="p">)</span>
<span class="n">start</span> <span class="o">=</span> <span class="n">samplerate</span> <span class="o">*</span> <span class="mi">14</span> <span class="c1"># 10 seconds in</span>
<span class="n">end</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="n">samplerate</span> <span class="o">*</span> <span class="mi">10</span> <span class="c1"># 5 second duration</span>
<span class="n">Audio</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">tabulasa</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="mi">0</span><span class="p">],</span> <span class="n">rate</span><span class="o">=</span><span class="n">samplerate</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area"><div class="prompt output_prompt">Out[2]:</div>
<div class="output_html rendered_html output_subarea output_execute_result">
<audio controls="controls" >
<source src="data:audio/wav;base64,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
Your browser does not support the audio element.
</audio>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Next, we'll define the code we will be using to do PCA. It's very short, as the PCA algorithm is very simple.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In&nbsp;[3]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">sklearn.decomposition</span> <span class="k">import</span> <span class="n">PCA</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="k">def</span> <span class="nf">pca_reduce</span><span class="p">(</span><span class="n">signal</span><span class="p">,</span> <span class="n">n_components</span><span class="p">,</span> <span class="n">block_size</span><span class="o">=</span><span class="mi">1024</span><span class="p">):</span>
<span class="c1"># First, zero-pad the signal so that it is divisible by the block_size</span>
<span class="n">samples</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">signal</span><span class="p">)</span>
<span class="n">hanging</span> <span class="o">=</span> <span class="n">block_size</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">mod</span><span class="p">(</span><span class="n">samples</span><span class="p">,</span> <span class="n">block_size</span><span class="p">)</span>
<span class="n">padded</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">lib</span><span class="o">.</span><span class="n">pad</span><span class="p">(</span><span class="n">signal</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">hanging</span><span class="p">),</span> <span class="s1">&#39;constant&#39;</span><span class="p">,</span> <span class="n">constant_values</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="c1"># Reshape the signal to have 1024 dimensions</span>
<span class="n">reshaped</span> <span class="o">=</span> <span class="n">padded</span><span class="o">.</span><span class="n">reshape</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">padded</span><span class="p">)</span> <span class="o">//</span> <span class="n">block_size</span><span class="p">,</span> <span class="n">block_size</span><span class="p">))</span>
<span class="c1"># Second, do the actual PCA process</span>
<span class="n">pca</span> <span class="o">=</span> <span class="n">PCA</span><span class="p">(</span><span class="n">n_components</span><span class="o">=</span><span class="n">n_components</span><span class="p">)</span>
<span class="n">pca</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">reshaped</span><span class="p">)</span>
<span class="n">transformed</span> <span class="o">=</span> <span class="n">pca</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">reshaped</span><span class="p">)</span>
<span class="n">reconstructed</span> <span class="o">=</span> <span class="n">pca</span><span class="o">.</span><span class="n">inverse_transform</span><span class="p">(</span><span class="n">transformed</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">padded</span><span class="p">)))</span>
<span class="k">return</span> <span class="n">pca</span><span class="p">,</span> <span class="n">transformed</span><span class="p">,</span> <span class="n">reconstructed</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Now that we've got our functions set up, let's try actually running something. First, we'll use <code>n_components == block_size</code>, which implies that we should end up with the same signal we started with.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In&nbsp;[4]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span class="n">tabulasa_left</span> <span class="o">=</span> <span class="n">tabulasa</span><span class="p">[:,</span><span class="mi">0</span><span class="p">]</span>
<span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">reconstructed</span> <span class="o">=</span> <span class="n">pca_reduce</span><span class="p">(</span><span class="n">tabulasa_left</span><span class="p">,</span> <span class="mi">1024</span><span class="p">,</span> <span class="mi">1024</span><span class="p">)</span>
<span class="n">Audio</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">reconstructed</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="n">rate</span><span class="o">=</span><span class="n">samplerate</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area"><div class="prompt output_prompt">Out[4]:</div>
<div class="output_html rendered_html output_subarea output_execute_result">
<audio controls="controls" >
<source src="data:audio/wav;base64,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
Your browser does not support the audio element.
</audio>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>OK, that does indeed sound like what we originally had. Let's drastically cut down the number of components we're doing this with as a sanity check: the audio quality should become incredibly poor.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In&nbsp;[5]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">reconstructed</span> <span class="o">=</span> <span class="n">pca_reduce</span><span class="p">(</span><span class="n">tabulasa_left</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">1024</span><span class="p">)</span>
<span class="n">Audio</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">reconstructed</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="n">rate</span><span class="o">=</span><span class="n">samplerate</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area"><div class="prompt output_prompt">Out[5]:</div>
<div class="output_html rendered_html output_subarea output_execute_result">
<audio controls="controls" >
<source src="data:audio/wav;base64,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
Your browser does not support the audio element.
</audio>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>As expected, our reconstructed audio does sound incredibly poor! But there's something else very interesting going on here under the hood. Did you notice that the bassline comes across very well, but that there's no midrange or treble? The drums are almost entirely gone.</p>
<h2 id="Drop-the-(Treble)"><a href="https://youtu.be/Ua0KpfJsxKo?t=1m17s">Drop the (Treble)</a><a class="anchor-link" href="#Drop-the-(Treble)">&#182;</a></h2><p>It will help to understand PCA more fully when trying to read this part, but I'll do my best to break it down. PCA tries to find a way to best represent the dataset using "components." Think of each "component" as containing some of the information you need in order to reconstruct the full audio. For example, you might have a "low frequency" component that contains all the information you need in order to hear the bassline. There might be other components that explain the high frequency things like singers, or melodies, that you also need.</p>
<p>What makes PCA interesting is that it attempts to find the "most important" components in explaining the signal. In a signal processing world, this means that PCA is trying to find the signal amongst the noise in your data. In our case, this means that PCA, when forced to work with small numbers of components, will chuck out the noisy components first. It's doing it's best job to reconstruct the signal, but it has to make sacrifices somewhere.</p>
<p>So I've mentioned that PCA identifies the "noisy" components in our dataset. This is equivalent to saying that PCA removes the "high frequency" components in this case: it's very easy to represent a low-frequency signal like a bassline. It's far more difficult to represent a high-frequency signal because it's changing all the time. When you force PCA to make a tradeoff by using a small number of components, the best it can hope to do is replicate the low-frequency sections and skip the high-frequency things.</p>
<p>This is a very interesting insight, and it also has echos (pardon the pun) of how humans understand music in general. Other encoding schemes (like MP3, etc.) typically chop off a lot of the high-frequency range as well. There is typically a lot of high-frequency noise in audio that is nearly impossible to hear, so it's easy to remove it without anyone noticing. PCA ends up doing something similar, and while that certainly wasn't the intention, it is an interesting effect.</p>
<h2 id="A-More-Realistic-Example">A More Realistic Example<a class="anchor-link" href="#A-More-Realistic-Example">&#182;</a></h2><p>So we've seen the edge cases so far: Using a large number of components results in audio very close to the original, and using a small number of components acts as a low-pass filter. How about we develop something that sounds "good enough" in practice, that we can use as a benchmark for size? We'll use ourselves as judges of audio quality, and build another function to help us estimate how much space we need to store everything in.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In&nbsp;[6]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span class="kn">from</span> <span class="nn">bz2</span> <span class="k">import</span> <span class="n">compress</span>
<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
<span class="k">def</span> <span class="nf">raw_estimate</span><span class="p">(</span><span class="n">transformed</span><span class="p">,</span> <span class="n">pca</span><span class="p">):</span>
<span class="c1"># We assume that we&#39;ll be storing things as 16-bit WAV,</span>
<span class="c1"># meaning two bytes per sample</span>
<span class="n">signal_bytes</span> <span class="o">=</span> <span class="n">transformed</span><span class="o">.</span><span class="n">tobytes</span><span class="p">()</span>
<span class="c1"># PCA stores the components as floating point, we&#39;ll assume</span>
<span class="c1"># that means 32-bit floats, so 4 bytes per element</span>
<span class="n">component_bytes</span> <span class="o">=</span> <span class="n">transformed</span><span class="o">.</span><span class="n">tobytes</span><span class="p">()</span>
<span class="c1"># Return a result in megabytes</span>
<span class="k">return</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">signal_bytes</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">component_bytes</span><span class="p">))</span> <span class="o">/</span> <span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">20</span><span class="p">)</span>
<span class="c1"># Do an estimate for lossless compression applied on top of our</span>
<span class="c1"># PCA reduction</span>
<span class="k">def</span> <span class="nf">bz2_estimate</span><span class="p">(</span><span class="n">transformed</span><span class="p">,</span> <span class="n">pca</span><span class="p">):</span>
<span class="n">bytestring</span> <span class="o">=</span> <span class="n">transformed</span><span class="o">.</span><span class="n">tobytes</span><span class="p">()</span> <span class="o">+</span> <span class="n">b</span><span class="s1">&#39;;&#39;</span> <span class="o">+</span> <span class="n">pca</span><span class="o">.</span><span class="n">components_</span><span class="o">.</span><span class="n">tobytes</span><span class="p">()</span>
<span class="n">compressed</span> <span class="o">=</span> <span class="n">compress</span><span class="p">(</span><span class="n">bytestring</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">compressed</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">20</span><span class="p">)</span>
2016-11-01 16:19:21 -04:00
2018-01-16 20:28:29 -05:00
<span class="n">compression_attempts</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
<span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span>
<span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span>
<span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">32</span><span class="p">),</span>
<span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">256</span><span class="p">),</span>
<span class="p">(</span><span class="mi">32</span><span class="p">,</span> <span class="mi">256</span><span class="p">),</span>
<span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">256</span><span class="p">),</span>
<span class="p">(</span><span class="mi">128</span><span class="p">,</span> <span class="mi">1024</span><span class="p">),</span>
<span class="p">(</span><span class="mi">256</span><span class="p">,</span> <span class="mi">1024</span><span class="p">),</span>
<span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">1024</span><span class="p">),</span>
<span class="p">(</span><span class="mi">128</span><span class="p">,</span> <span class="mi">2048</span><span class="p">),</span>
<span class="p">(</span><span class="mi">256</span><span class="p">,</span> <span class="mi">2048</span><span class="p">),</span>
<span class="p">(</span><span class="mi">512</span><span class="p">,</span> <span class="mi">2048</span><span class="p">),</span>
<span class="p">(</span><span class="mi">1024</span><span class="p">,</span> <span class="mi">2048</span><span class="p">)</span>
<span class="p">]</span>
2016-11-01 16:19:21 -04:00
2018-01-16 20:28:29 -05:00
<span class="k">def</span> <span class="nf">build_estimates</span><span class="p">(</span><span class="n">signal</span><span class="p">,</span> <span class="n">n_components</span><span class="p">,</span> <span class="n">block_size</span><span class="p">):</span>
<span class="n">pca</span><span class="p">,</span> <span class="n">transformed</span><span class="p">,</span> <span class="n">recon</span> <span class="o">=</span> <span class="n">pca_reduce</span><span class="p">(</span><span class="n">tabulasa_left</span><span class="p">,</span> <span class="n">n_components</span><span class="p">,</span> <span class="n">block_size</span><span class="p">)</span>
<span class="n">raw_pca_estimate</span> <span class="o">=</span> <span class="n">raw_estimate</span><span class="p">(</span><span class="n">transformed</span><span class="p">,</span> <span class="n">pca</span><span class="p">)</span>
<span class="n">bz2_pca_estimate</span> <span class="o">=</span> <span class="n">bz2_estimate</span><span class="p">(</span><span class="n">transformed</span><span class="p">,</span> <span class="n">pca</span><span class="p">)</span>
<span class="n">raw_size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">recon</span><span class="o">.</span><span class="n">tobytes</span><span class="p">())</span> <span class="o">/</span> <span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">20</span><span class="p">)</span>
<span class="k">return</span> <span class="n">raw_size</span><span class="p">,</span> <span class="n">raw_pca_estimate</span><span class="p">,</span> <span class="n">bz2_pca_estimate</span>
<span class="n">pca_compression_results</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">([</span>
<span class="n">build_estimates</span><span class="p">(</span><span class="n">tabulasa_left</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">bs</span><span class="p">)</span>
<span class="k">for</span> <span class="n">n</span><span class="p">,</span> <span class="n">bs</span> <span class="ow">in</span> <span class="n">compression_attempts</span>
<span class="p">])</span>
<span class="n">pca_compression_results</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Raw&quot;</span><span class="p">,</span> <span class="s2">&quot;PCA&quot;</span><span class="p">,</span> <span class="s2">&quot;PCA w/ BZ2&quot;</span><span class="p">]</span>
<span class="n">pca_compression_results</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">compression_attempts</span>
<span class="n">pca_compression_results</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area"><div class="prompt output_prompt">Out[6]:</div>
<div class="output_html rendered_html output_subarea output_execute_result">
<div>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Raw</th>
<th>PCA</th>
<th>PCA w/ BZ2</th>
</tr>
</thead>
<tbody>
<tr>
<th>(1, 1)</th>
<td>69.054298</td>
<td>138.108597</td>
<td>16.431797</td>
</tr>
<tr>
<th>(1, 2)</th>
<td>69.054306</td>
<td>69.054306</td>
<td>32.981380</td>
</tr>
<tr>
<th>(1, 4)</th>
<td>69.054321</td>
<td>34.527161</td>
<td>16.715032</td>
</tr>
<tr>
<th>(4, 32)</th>
<td>69.054443</td>
<td>17.263611</td>
<td>8.481735</td>
</tr>
<tr>
<th>(16, 256)</th>
<td>69.054688</td>
<td>8.631836</td>
<td>4.274846</td>
</tr>
<tr>
<th>(32, 256)</th>
<td>69.054688</td>
<td>17.263672</td>
<td>8.542909</td>
</tr>
<tr>
<th>(64, 256)</th>
<td>69.054688</td>
<td>34.527344</td>
<td>17.097543</td>
</tr>
<tr>
<th>(128, 1024)</th>
<td>69.054688</td>
<td>17.263672</td>
<td>9.430644</td>
</tr>
<tr>
<th>(256, 1024)</th>
<td>69.054688</td>
<td>34.527344</td>
<td>18.870387</td>
</tr>
<tr>
<th>(512, 1024)</th>
<td>69.054688</td>
<td>69.054688</td>
<td>37.800940</td>
</tr>
<tr>
<th>(128, 2048)</th>
<td>69.062500</td>
<td>8.632812</td>
<td>6.185015</td>
</tr>
<tr>
<th>(256, 2048)</th>
<td>69.062500</td>
<td>17.265625</td>
<td>12.366942</td>
</tr>
<tr>
<th>(512, 2048)</th>
<td>69.062500</td>
<td>34.531250</td>
<td>24.736506</td>
</tr>
<tr>
<th>(1024, 2048)</th>
<td>69.062500</td>
<td>69.062500</td>
<td>49.517493</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>As we can see, there are a couple of instances where we do nearly 20 times better on storage space than the uncompressed file. Let's here what that sounds like:</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In&nbsp;[7]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">reconstructed</span> <span class="o">=</span> <span class="n">pca_reduce</span><span class="p">(</span><span class="n">tabulasa_left</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">256</span><span class="p">)</span>
<span class="n">Audio</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">reconstructed</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="n">rate</span><span class="o">=</span><span class="n">samplerate</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area"><div class="prompt output_prompt">Out[7]:</div>
<div class="output_html rendered_html output_subarea output_execute_result">
<audio controls="controls" >
<source src="data:audio/wav;base64,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
Your browser does not support the audio element.
</audio>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>It sounds incredibly poor though. Let's try something that's a bit more realistic:</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In&nbsp;[8]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">reconstructed</span> <span class="o">=</span> <span class="n">pca_reduce</span><span class="p">(</span><span class="n">tabulasa_left</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
<span class="n">Audio</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">reconstructed</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="n">rate</span><span class="o">=</span><span class="n">samplerate</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area"><div class="prompt output_prompt">Out[8]:</div>
<div class="output_html rendered_html output_subarea output_execute_result">
<audio controls="controls" >
<source src="data:audio/wav;base64,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
Your browser does not support the audio element.
</audio>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>And just out of curiosity, we can try something that has the same ratio of components to block size. This should be close to an apples-to-apples comparison.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In&nbsp;[9]:</div>
<div class="inner_cell">
<div class="input_area">
<div class=" highlight hl-ipython3"><pre><span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">reconstructed</span> <span class="o">=</span> <span class="n">pca_reduce</span><span class="p">(</span><span class="n">tabulasa_left</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">256</span><span class="p">)</span>
<span class="n">Audio</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">reconstructed</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="n">rate</span><span class="o">=</span><span class="n">samplerate</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area"><div class="prompt output_prompt">Out[9]:</div>
<div class="output_html rendered_html output_subarea output_execute_result">
<audio controls="controls" >
<source src="data:audio/wav;base64,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
Your browser does not support the audio element.
</audio>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>The smaller block size definitely has better high-end response, but I personally think the larger block size sounds better overall.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Conclusions">Conclusions<a class="anchor-link" href="#Conclusions">&#182;</a></h2><p>So, what do I think about audio compression using PCA?</p>
<p>Strangely enough, it actually works pretty well relative to what I expected. That said, it's a terrible idea in general.</p>
<p>First off, you don't really save any space. The component matrix needed to actually run the PCA algorithm takes up a lot of space on its own, so it's very difficult to save space without sacrificing a huge amount of audio quality. And even then, codecs like AAC sound very nice even at bitrates that this PCA method could only dream of.</p>
<p>Second, there's the issue of audio streaming. PCA relies on two components: the datastream, and a matrix used to reconstruct the original signal. While it is easy to stream the data, you can't stream that matrix. And even if you divided the stream up into small blocks to give you a small matrix, you must guarantee that the matrix arrives; if you don't have that matrix, the data stream will make no sense whatsoever.</p>
<p>All said, this was an interesting experiment. It's really cool seeing PCA used for signal analysis where I haven't seen it applied before, but I don't think it will lead to any practical results. Look forward to more signal processing stuff in the future!</p>
</div>
</div>
</div></p>
<div class="comments">
<div id="disqus_thread"></div>
<script type="text/javascript">
var disqus_shortname = 'bradleespeice';
var disqus_identifier = 'audio-compression-using-pca.html';
var disqus_url = 'https://bspeice.github.io/audio-compression-using-pca.html';
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the comments.</noscript>
</div>
2016-11-01 16:19:21 -04:00
</div>
<!-- /Content -->
<!-- Footer -->
<div class="footer gradient-2">
<div class="container footer-container ">
<div class="row">
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-3">
<div class="footer-title"></div>
<ul class="list-unstyled">
2018-01-16 20:28:29 -05:00
<li><a href="https://bspeice.github.io/feeds/all.atom.xml" type="application/atom+xml" rel="alternate"></a></li>
2016-11-01 16:19:21 -04:00
</ul>
</div>
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-3">
<div class="footer-title"></div>
<ul class="list-unstyled">
<li><a href="https://github.com/bspeice" target="_blank">Github</a></li>
<li><a href="https://www.linkedin.com/in/bradleespeice" target="_blank">LinkedIn</a></li>
</ul>
</div>
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-3">
</div>
<div class="col-xs-12 col-sm-3 col-md-3 col-lg-3">
<p class="pull-right text-right">
<small><em>Proudly powered by <a href="http://docs.getpelican.com/" target="_blank">pelican</a></em></small><br/>
<small><em>Theme and code by <a href="https://github.com/molivier" target="_blank">molivier</a></em></small><br/>
<small></small>
</p>
</div>
</div>
</div>
</div>
<!-- /Footer -->
</body>
</html>