<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>KARILUOMA</title>
	<atom:link href="http://mattikariluoma.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://mattikariluoma.com</link>
	<description></description>
	<lastBuildDate>Tue, 04 Oct 2011 16:08:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>MICS Conference</title>
		<link>http://mattikariluoma.com/?p=318</link>
		<comments>http://mattikariluoma.com/?p=318#comments</comments>
		<pubDate>Sun, 10 Apr 2011 02:39:42 +0000</pubDate>
		<dc:creator>matti</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[boring]]></category>

		<guid isPermaLink="false">http://mattikariluoma.com/?p=318</guid>
		<description><![CDATA[A colleague recently presented a paper at the MICS 2011 Conference in Duluth, MN. Since I was the first to google the knapsack problem for him (among other minor things), I became second author!]]></description>
			<content:encoded><![CDATA[<p>A colleague recently presented a <a href="files/optimization_of_job_efficiency_heterogenous_beowulf.pdf">paper</a> at the MICS 2011 Conference in Duluth, MN. Since I was the first to google the <a href="http://en.wikipedia.org/wiki/Knapsack_problem">knapsack problem</a> for him (among other minor things), I became second author!</p>
]]></content:encoded>
			<wfw:commentRss>http://mattikariluoma.com/?feed=rss2&#038;p=318</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Laser Overdrive</title>
		<link>http://mattikariluoma.com/?p=320</link>
		<comments>http://mattikariluoma.com/?p=320#comments</comments>
		<pubDate>Fri, 08 Apr 2011 11:27:38 +0000</pubDate>
		<dc:creator>matti</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[laser]]></category>

		<guid isPermaLink="false">http://mattikariluoma.com/?p=320</guid>
		<description><![CDATA[Download: EMC Configuration (5K) Sample gcode (1K) Gcode conversion script (3K) Gcode concatenation script (1K) Apparently, owning a laser cutter opens a whole new world insofar as building things is concerned. I just couldn&#8217;t resist the allure! I purchased a 40W engraver/cutter from Full Spectrum Engineering during spring break (Mar 11-18). It finally arrived on [...]]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody>
<tr>
<td>Download:</td>
<td><a href="http://www.mattikariluoma.com/files/fsl_config.tar.gz">EMC Configuration</a> (5K)</td>
</tr>
</tr>
<tr>
<td></td>
<td><a href="http://www.mattikariluoma.com/files/lines.ngc">Sample gcode</a> (1K)</td>
</tr>
<tr>
<td></td>
<td><a href="http://www.mattikariluoma.com/files/gcodetools_to_FSE_laser.sh">Gcode conversion script</a> (3K)</td>
</tr>
<tr>
<td></td>
<td><a href="http://www.mattikariluoma.com/files/concatenate_gcode.sh">Gcode concatenation script</a> (1K)</td>
</tr>
<tr>
<td></td>
</tr>
</tbody>
</table>
<p>Apparently, owning a laser cutter opens a whole new world insofar as building things is concerned. I just couldn&#8217;t resist the allure!<br />
<img src="images/laser_warning.jpg" alt="The warning label on the back of a laser cutter" /></p>
<p>I purchased a 40W engraver/cutter from <a href="http://www.fullspectrumengineering.com/">Full Spectrum Engineering</a> during spring break (Mar 11-18). It finally arrived on the 6th of April. I stayed up until the wee hours of the morning configuring, aligning, and getting a few test cuts done:<br />
<img src="images/laser_cutting.jpg" alt="A laser cutter cutting out a piece of 3mm plywood" /></p>
<p>I do not regret opting out of the Windows-only USB printer interface for the machine, I&#8217;ve gotten great results using only the parallel port, <a href="http://www.linuxcnc.org/">EMC2</a>, and <a href="http://inkscape.org/" >Inkscape</a>. <a href="http://www.mattikariluoma.com/files/fsl_config.tar.gz">Configuration files for the 40W FSE Laser under EMC2.</a></p>
<p>The only hiccup so far is the manual massaging of the gcode that the <a href="http://cnc-club.ru/forum/viewtopic.php?t=35" >gcodetools</a> Inkscape extension spits out, but that should be easy to remedy. <a href="http://www.mattikariluoma.com/files/lines.ngc"> A sample massaged gcode file.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mattikariluoma.com/?feed=rss2&#038;p=320</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>An Overdrive Circuit</title>
		<link>http://mattikariluoma.com/?p=324</link>
		<comments>http://mattikariluoma.com/?p=324#comments</comments>
		<pubDate>Tue, 22 Feb 2011 22:30:17 +0000</pubDate>
		<dc:creator>matti</dc:creator>
				<category><![CDATA[Electronic]]></category>
		<category><![CDATA[distortion]]></category>
		<category><![CDATA[electronics]]></category>
		<category><![CDATA[guitar]]></category>
		<category><![CDATA[overdrive]]></category>

		<guid isPermaLink="false">http://mattikariluoma.com/?p=324</guid>
		<description><![CDATA[Last summer I slapped together a workbench project into an enclosure and gave it to a friend, he liked how it sounded. Eventually it broke down, so I offered to design a PCB to replace the circuitry. The Overdrive circuit, next to the replacee: Design files: PCB, Silk]]></description>
			<content:encoded><![CDATA[<p>Last summer I slapped together a workbench project into an enclosure and gave it to a friend, he liked how it sounded. Eventually it broke down, so I offered to design a PCB to replace the circuitry.</p>
<p>The Overdrive circuit, next to the replacee:<br />
<img src="images/overdrive_completed.jpg" alt="An Overdrive circuit populating a PCB" /><br />
Design files: <a href="images/distort_pcb.png">PCB</a>, <a href="images/distort_silk.png">Silk</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mattikariluoma.com/?feed=rss2&#038;p=324</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wireless DDR Pad for the PS3</title>
		<link>http://mattikariluoma.com/?p=327</link>
		<comments>http://mattikariluoma.com/?p=327#comments</comments>
		<pubDate>Fri, 21 Jan 2011 03:30:59 +0000</pubDate>
		<dc:creator>matti</dc:creator>
				<category><![CDATA[Electronic]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[ddr]]></category>
		<category><![CDATA[electronics]]></category>
		<category><![CDATA[ps3]]></category>

		<guid isPermaLink="false">http://mattikariluoma.com/?p=327</guid>
		<description><![CDATA[A friend needed help hooking up his PS3 USB DDR pad to his PS3 while it was emulating a PS2 game. The original pad used a USB connection, but was not a &#8216;Sony blessed&#8217; interface. The first step was to acquire a PS3 controller to sacrifice. We removed the plastic shell and plastic interface board, [...]]]></description>
			<content:encoded><![CDATA[<p>A friend needed help hooking up his PS3 USB DDR pad to his PS3 while it was emulating a PS2 game.</p>
<p>The original pad used a USB connection, but was not a &#8216;Sony blessed&#8217; interface. The first step was to acquire a PS3 controller to sacrifice. We removed the plastic shell and plastic interface board, then I cooked up the following PCB to interface with it:<br />
<img src="images/ps3_ddr_interface.jpg" alt="A PCB To interface with a PS3 controller" /><br />
Design files: <a href="images/ps3_interface_pcb.png">PCB</a>, <a href="images/ps3_interface_silk.png">Silkscreen</a></p>
<p>Next, we cracked the USB Pad, removed some extraneous plastic and circuitry, and attached our &#8220;controller-within-a-controller&#8221;:<br />
<img src="images/ps3_ddr_connected.jpg" alt="A PS3 controller connected to a USB dnace pad" /><br />
<img src="images/ps3_ddr_complete.jpg" alt="The completed PS3 controller within a USB dance pad" /></p>
]]></content:encoded>
			<wfw:commentRss>http://mattikariluoma.com/?feed=rss2&#038;p=327</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cURL + gzip (Beating a Dead Horse)</title>
		<link>http://mattikariluoma.com/?p=284</link>
		<comments>http://mattikariluoma.com/?p=284#comments</comments>
		<pubDate>Fri, 15 Oct 2010 04:48:45 +0000</pubDate>
		<dc:creator>matti</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[gzip]]></category>

		<guid isPermaLink="false">http://mattikariluoma.com/?p=284</guid>
		<description><![CDATA[Download: Source (11K) I wasn&#8217;t entirely satisfied with my previous attempt at HTTP/POST gzip-compression, so I wrote a more elegant solution (no XMLRPC libraries this time). A function to perform gzip-compression on a string: // see zlib's compress.c:compress() function for the original of this // modified function // // dest : destination buffer, malloc'd already [...]]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody>
<tr>
<td>Download:</td>
<td><a href="http://www.mattikariluoma.com/files/curl_post_gzip.c">Source</a> (11K)</td>
</tr>
<tr>
<td></td>
</tr>
</tbody>
</table>
<p>I wasn&#8217;t entirely satisfied with my previous <a href="http://mattikariluoma.com/?p=234">attempt</a> at HTTP/POST gzip-compression, so I wrote a more elegant solution (no XMLRPC libraries this time).</p>
<p>A function to perform gzip-compression on a string:</p>
<pre>
// see zlib's compress.c:compress() function for the original of this
// modified function
//
// dest      : destination buffer, malloc'd already
// destLen   : size of the malloc'd buffer
// source    : the uncompressed text
// sourceLen : the size of the uncompressed text
//
// this function returns an error code from the zlib library.
// upon return, dest contains the compressed output, and destLen
// contains the size of dest.
int string_gzip (char *dest, unsigned long *destLen, char *source, unsigned long sourceLen)
{
  char *header;

  sprintf(dest, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1],
          Z_DEFLATED, 0       , 0,0,0,0      , 0        , OS_CODE);
        //          , flags   , time         , xflags   ,        );

  header = dest;
  dest = &#038;dest[10]; // skip ahead of the header
  *destLen -= 10; // update our available length

  z_stream stream;
  int err;

  stream.next_in = source;
  stream.avail_in = sourceLen;
  #ifdef MAXSEG_64K
    /* Check for source &gt; 64K on 16-bit machine: */
    if (stream.avail_in != sourceLen)
      return Z_BUF_ERROR;
  #endif
  stream.next_out = dest;
  stream.avail_out = *destLen;
  if (stream.avail_out != *destLen)
    return Z_BUF_ERROR;

  stream.zalloc = Z_NULL;
  stream.zfree = Z_NULL;
  stream.opaque = Z_NULL;

  // instructs zlib not to write a zlib header
  err = deflateInit2( &#038;stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
                      -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY );
  if (err != Z_OK)
    return err;

  err = deflate(&#038;stream, Z_FINISH); // Z_FINISH or Z_NO_FLUSH if we have
                                    // more input still (we don't)
  if (err != Z_STREAM_END) {
      deflateEnd(&#038;stream);
      return err == Z_OK ? Z_BUF_ERROR : err;
  }
  *destLen = stream.total_out;

  err = deflateEnd(&#038;stream);

  dest = header; // put the header back on
  *destLen += 10; // update length of our data block

  return err;
}
</pre>
<p>Using this function to make a gzip-compressed HTTP/POST using <a href="http://curl.haxx.se/libcurl/">libcURL</a>:</p>
<pre>
   char *data = readXMLInput();
   unsigned long dataLength = strlen(data);
   unsigned long compressedDataLength = dataLength*1.1 + 22; // see zlib's compress.c
   char *compressedData = calloc(compressedDataLength,1);
   string_gzip(compressedData, &#038;compressedDataLength, (char*)data, dataLength);

    curl =  curl_easy_init();
    struct curl_slist *header_list=NULL;

    curl_easy_setopt(curl, CURLOPT_URL, "www.example.com/xmlrpc.php");
    // set the "Accept-Encoding: " header
    curl_easy_setopt(curl, CURLOPT_ENCODING, "gzip");
    // set the "Content-Encoding: ", "Content-Length: ", "Content-Type: " headers
    header_list = curl_slist_append(header_list, "Content-Encoding: gzip");
    header_list = curl_slist_append(header_list, "Content-Type: text/xml");
    sprintf(contentLengthBuf, "Content-Length: %d", compressedDataLength);
    header_list = curl_slist_append(header_list, contentLengthBuf);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);

    // Now specify the POST data
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, compressedData);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, compressedDataLength);

    // Perform request
    res = curl_easy_perform(curl);
    curl_slist_free_all(header_list);
    curl_easy_cleanup(curl);
    free(compressedData);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mattikariluoma.com/?feed=rss2&#038;p=284</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XML-RPC; Gzip</title>
		<link>http://mattikariluoma.com/?p=234</link>
		<comments>http://mattikariluoma.com/?p=234#comments</comments>
		<pubDate>Wed, 22 Sep 2010 01:16:15 +0000</pubDate>
		<dc:creator>matti</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[javamoo]]></category>

		<guid isPermaLink="false">http://mattikariluoma.com/?p=234</guid>
		<description><![CDATA[Download: Source (8K) Above is the source code for a simple* extension of ulxmlrpcpp that allows Gzip compression of XML-RPC. The simplest* method to perform a Remote Procedure Call (RPC) from one language to another is XML-RPC. The XML-RPC specification is dead simple; using XML, construct a procedure call, with the parameters of the call [...]]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody>
<tr>
<td>Download:</td>
<td><a href="http://www.mattikariluoma.com/files/ulxmlrpcpp-gzip.tar.bz2">Source</a> (8K)</td>
</tr>
<tr>
<td></td>
</tr>
</tbody>
</table>
<p>Above is the source code for a simple* extension of <a href="http://ulxmlrpcpp.sourceforge.net/" alt="C++ XML-RPC implementation">ulxmlrpcpp</a> that allows Gzip compression of XML-RPC.</p>
<p>The simplest* method to perform a Remote Procedure Call (RPC) from one language to another is XML-RPC. </p>
<p>The XML-RPC <a href="http://www.xmlrpc.com/spec">specification</a> <b>is</b> dead simple; using XML, construct a procedure call, with the parameters of the call as children. Then, send this XML document using HTTP/POST to the resource server, where the request is processed and an XML response is sent back containing the procedure&#8217;s result.</p>
<p>The problem I&#8217;m concerned with: using a Java Server (JavaMOO), construct an XML-RPC server that can communicate with a client written in C/C++, and do so efficiently enough to run a real-time virtual world.</p>
<p>This hardly seems like anything to right home about; in fact, I had no problem finding Java and C++ implementations of XML-RPC, and was performing RPCs within the hour.</p>
<p>The drama came when I considered efficiency, and hence compression. The XML-RPC specification is unclear/denies the use of any sort of compression on the XML document, which is a shame. Gzip compression is available as a vendor extension for the Java implementation I was using (Apache&#8217;s <a href="http://ws.apache.org/xmlrpc/" alt="Java XML-RPC implementation">ws-xmlrpc</a>). I found no such capabilities in any C/C++ implementations, so I wrote one up.</p>
<p>*: Nothing is ever simple.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattikariluoma.com/?feed=rss2&#038;p=234</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JavaMOO, javamoo-legacy</title>
		<link>http://mattikariluoma.com/?p=229</link>
		<comments>http://mattikariluoma.com/?p=229#comments</comments>
		<pubDate>Sun, 29 Aug 2010 02:25:38 +0000</pubDate>
		<dc:creator>matti</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[boring]]></category>
		<category><![CDATA[javamoo]]></category>

		<guid isPermaLink="false">http://mattikariluoma.com/?p=229</guid>
		<description><![CDATA[I&#8217;ve been tasked with some basic research. Now that we have two versions of JavaMOO (backstory), it&#8217;d be nice to know if one is more capable than the other. javamoo-legacy has the benefit of the doubt; we know it works in practice, and we have many usage tests backing up the majority of its functionality. [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been tasked with some basic research.</p>
<p>Now that we have two versions of JavaMOO (<a href="http://mattikariluoma.com/?p=203" alt="JavaMOO backstory">backstory</a>), it&#8217;d be nice to know if one is more capable than the other. </p>
<p>javamoo-legacy has the benefit of the doubt; we know it works in practice, and we have many usage tests backing up the majority of its functionality. JavaMOO has the benefit of a professional project; with plugins, post-build-time configuration; all the trappings of a polished product.</p>
<p>Here&#8217;s a plan of action:</p>
<ul>
<li>Familiarize with JavaMOO, compile</li>
<li>Write a client that communicates with both servers (RMI)</li>
<li>Perform some simple tasks like object creation, database queries, etc.</li>
<li>Draw conclusions, reformulate &#038; reiterate experiment</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://mattikariluoma.com/?feed=rss2&#038;p=229</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Simple Game Client</title>
		<link>http://mattikariluoma.com/?p=223</link>
		<comments>http://mattikariluoma.com/?p=223#comments</comments>
		<pubDate>Sun, 15 Aug 2010 05:17:04 +0000</pubDate>
		<dc:creator>matti</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[javamoo]]></category>
		<category><![CDATA[ogre]]></category>

		<guid isPermaLink="false">http://mattikariluoma.com/?p=223</guid>
		<description><![CDATA[Download: Source (2M) Nothing too exciting here. A C++/Ogre/Blender effort; controls are w,a,s,d for movement, &#8216;b&#8217; to drop a box, and &#8216;r&#8217; to load the auxiliary map texture.]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody>
<tr>
<td>Download:</td>
<td><a href="http://www.mattikariluoma.com/files/MooClient-0.1.tar.bz2">Source</a> (2M)</td>
</tr>
<tr>
<td></td>
</tr>
</tbody>
</table>
<p><img src="images/MooClient.png" alt="Screenshot of a simple ogre client"></p>
<p>Nothing too exciting here. A C++/Ogre/Blender effort; controls are w,a,s,d for movement, &#8216;b&#8217; to drop a box, and &#8216;r&#8217; to load the auxiliary map texture.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattikariluoma.com/?feed=rss2&#038;p=223</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Salaryman</title>
		<link>http://mattikariluoma.com/?p=209</link>
		<comments>http://mattikariluoma.com/?p=209#comments</comments>
		<pubDate>Sun, 08 Aug 2010 20:32:01 +0000</pubDate>
		<dc:creator>matti</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[boring]]></category>
		<category><![CDATA[javamoo]]></category>

		<guid isPermaLink="false">http://mattikariluoma.com/?p=209</guid>
		<description><![CDATA[I&#8217;ve been hired by WoWiWe Instruction Co. The job description: Using the existing JavaMOO server, build a &#8220;World Development Tool&#8221; to aide content experts (grad students) in the rapid development of educational games. The project must be delivered before December 31st, 2010; when my employment terminates. This sort of a finite-length employment makes a lot [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been hired by <a href="http://www.wowiwe.net/">WoWiWe Instruction Co.</a></p>
<p>The job description: </p>
<blockquote><p>Using the existing JavaMOO server, build a &#8220;World Development Tool&#8221; to aide content experts (grad students) in the rapid development of educational games.</p></blockquote>
<p>The project must be delivered before December 31st, 2010; when my employment terminates. This sort of a finite-length employment makes a lot of sense to me; it allows me to plan for the future (graduate school) while building my job experience. Much like an internship, but better paying.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattikariluoma.com/?feed=rss2&#038;p=209</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Simple Equalization Circuit</title>
		<link>http://mattikariluoma.com/?p=206</link>
		<comments>http://mattikariluoma.com/?p=206#comments</comments>
		<pubDate>Fri, 09 Jul 2010 00:55:08 +0000</pubDate>
		<dc:creator>matti</dc:creator>
				<category><![CDATA[Electronic]]></category>
		<category><![CDATA[electronics]]></category>
		<category><![CDATA[equalizer]]></category>
		<category><![CDATA[guitar]]></category>

		<guid isPermaLink="false">http://mattikariluoma.com/?p=206</guid>
		<description><![CDATA[A friends&#8217; birthday&#8217;s coming up, and two of us have gotten together to give him a great present. A guitar&#8217;s the gift, but we can&#8217;t just give the birthday boy a used guitar! We decided to put a speaker into the body of the guitar, but in testing (before drilling) we found that the bass [...]]]></description>
			<content:encoded><![CDATA[<p>A friends&#8217; birthday&#8217;s coming up, and two of us have gotten together to give him a great present.</p>
<p><img src="images/Equalizer_mounted.png" alt="A guitar with two on-board speakers"></p>
<p>A guitar&#8217;s the gift, but we can&#8217;t just give the birthday boy a used guitar! We decided to put a speaker into the body of the guitar, but in testing (before drilling) we found that the bass strings overtook the treble. We had two choices: a simple equalizer, or two speakers. </p>
<p>After we chose to use two speakers, we tried a few things to get the desired effect. The simplest approach, the approach used in mass-produced dual-speaker systems (think plastic boombox), is to use a filtering capacitor for the bass speaker, and feed the plain signal into the treble speaker. </p>
<p>This approach was dismissed for two reasons:</p>
<ul>
<li>We needed to decrease the volume of the bass in <b>both</b> speakers</li>
<li>We were halfway towards an op-amp buffered equalizer circuit already, as we needed to amplify the guitar to drive the speakers</li>
</ul>
<p>Our second point became moot in the end, as we ended up using three op-amps to make the 1x buffer/ 2x equalizer, and an additional two op-amps to drive the speakers themselves. We could have used the fourth op-amp as an adder, and fed the output to one speaker. However, the clarity would have suffered so we went ahead with a two speaker design.</p>
<p><a href="images/Equalizer_schematic.png"><img src="images/Equalizer_schematic.png" alt="An equalization circuit employing a TL074 and two LM386 ICs"></a><br />
<img src="images/Equalizer_circuit.png" alt="The equalization circuit implemented"></p>
]]></content:encoded>
			<wfw:commentRss>http://mattikariluoma.com/?feed=rss2&#038;p=206</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

