| 
							- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 - <HTML>
 - 
 - <HEAD>
 - 	<TITLE>
 - 	Secret Rabbit Code (aka libsamplerate)
 - 	</TITLE>
 - 	<META NAME="Author"      CONTENT="Erik de Castro Lopo (erikd AT mega-nerd DOT com)">
 -     <META NAME="Version"     CONTENT="libsamplerate-0.1.8">
 - 	<META NAME="Description" CONTENT="The Secret Rabbit Code Home Page">
 - 	<META NAME="Keywords"    CONTENT="libsamplerate sound resample audio dsp Linux">
 - 	<LINK REL=StyleSheet HREF="SRC.css" TYPE="text/css" MEDIA="all">
 - </HEAD>
 - 
 - <BODY TEXT="#FFFFFF" BGCOLOR="#000000" LINK="#FB1465" VLINK="#FB1465" ALINK="#FB1465">
 - <!-- pepper -->
 - <CENTER>
 - 	<IMG SRC="SRC.png" HEIGHT=100 WIDTH=760 ALT="SRC.png">
 - </CENTER>
 - <!-- pepper -->
 - <BR>
 - <!-- pepper -->
 - <TABLE ALIGN="center" WIDTH="98%">
 - <TR>
 - <TD VALIGN="top">
 - <BR>
 - <DIV CLASS="nav">
 - 	<BR>
 - 	<A HREF="index.html">Home</A><BR>
 - 	<A HREF="license.html">License</A><BR>
 - 	<A HREF="history.html">History</A><BR>
 - 	<A HREF="download.html">Download</A><BR>
 - 	<A HREF="quality.html">Quality</A><BR>
 - 	<A HREF="api.html">API</A><BR>
 - 	<A HREF="bugs.html">Bug Reporting</A><BR>
 - 	<A HREF="win32.html">On Win32</A><BR>
 - 	<A HREF="faq.html">FAQ</A><BR>
 - 	<A HREF="lists.html">Mailing Lists</A><BR>
 - 	<A HREF="ChangeLog">ChangeLog</A><BR>
 - <BR>
 - <DIV CLASS="block">
 - Author :<BR>Erik de Castro Lopo
 - <!-- pepper -->
 - <BR><BR>
 - <!-- pepper -->
 - 
 - </DIV>
 - 	<IMG SRC=
 - 	"/cgi-bin/Count.cgi?ft=6|frgb=55;55;55|tr=0|md=6|dd=B|st=1|sh=1|df=src_api.dat"
 - 	HEIGHT=30 WIDTH=100 ALT="counter.gif">
 - </DIV>
 - 
 - </TD>
 - <!-- pepper -->
 - <!-- ######################################################################## -->
 - <!-- pepper -->
 - <TD VALIGN="top">
 - <DIV CLASS="block">
 - 
 - <H1><B>Frequently Asked Questions</B></H1>
 - <P>
 - <A HREF="#Q001">Q1 : Is it normal for the output of libsamplerate to be louder
 - 	than its input?</A><BR><BR>
 - <A HREF="#Q002">Q2 : On Unix/Linux/MacOSX, what is the best way of detecting
 - 	the presence and location of libsamplerate and its header file using
 - 	autoconf?</A><BR><BR>
 - <A HREF="#Q003">Q3 : If I upsample and downsample to the original rate, for
 - 	example 44.1->96->44.1, do I get an identical signal as the one before the
 - 	up/down resampling?</A><BR><BR>
 - <A HREF="#Q004">Q4 : If I ran src_simple (libsamplerate) on small chunks (160
 - 	frames) would that sound bad?</A><BR><BR>
 - <A HREF="#Q005">Q5 : I'm using libsamplerate but the high quality settings
 - 	sound worse than the SRC_LINEAR converter. Why?</A><BR><BR>
 - <A HREF="#Q006">Q6 : I'm use the SRC_SINC_* converters and up-sampling by a ratio of 
 - 	2. I reset the converter and put in 1000 samples and I expect to get 2000
 - 	samples out, but I'm getting less than that. Why?</A><BR><BR>
 - <A HREF="#Q007">Q7 : I have input and output sample rates that are integer
 - 	values, but the API wants me to divide one by the other and put the result
 - 	in a floating point number. Won't this case problems for long running
 - 	conversions?</A><BR><BR>
 - </P>
 - <HR>
 - <!-- ========================================================================= -->
 - <A NAME="Q001"></A>
 - <H2><BR><B>Q1 : Is it normal for the output of libsamplerate to be louder
 - 	than its input?</B></H2>
 - <P>
 - The output of libsamplerate will be roughly the same volume as the input.
 - However, even if the input is strictly in the range (-1.0, 1.0), it is still
 - possible for the output to contain peak values outside this range.
 - </P>
 - <P>
 - Consider four consecutive samples of [0.5 0.999 0.999 0.5].
 - If we are up sampling by a factor of two we need to insert samples between
 - each of the existing samples.
 - Its pretty obvious then, that the sample between the two 0.999 values should
 - and will be bigger than 0.999.
 - </P>
 - <P>
 - This means that anyone using libsamplerate should normalize its output before
 - doing things like saving the audio to a 16 bit WAV file.
 - </P>
 - 
 - <!-- pepper -->
 - <!-- ========================================================================= -->
 - 
 - <a NAME="Q002"></a>
 - <h2><br><b>Q2 : On Unix/Linux/MacOSX, what is the best way of detecting
 - 	the presence and location of libsamplerate and its header file using
 - 	autoconf?</b></h2>
 - 
 - <p>
 - libsamplerate uses the pkg-config (man pkg-config) method of registering itself
 - with the host system.
 - The best way of detecting its presence is using something like this in configure.ac
 - (or configure.in):
 - </p>
 - 
 - <pre>
 -     PKG_CHECK_MODULES(SAMPLERATE, samplerate >= 0.1.3,
 -             ac_cv_samplerate=1, ac_cv_samplerate=0)
 - 
 -     AC_DEFINE_UNQUOTED([HAVE_SAMPLERATE],${ac_cv_samplerate},
 -             [Set to 1 if you have libsamplerate.])
 - 
 -     AC_SUBST(SAMPLERATE_CFLAGS)
 -     AC_SUBST(SAMPLERATE_LIBS)
 - </pre>
 - <p>
 - This will automatically set the <b>SAMPLERATE_CFLAGS</b> and <b>SAMPLERATE_LIBS</b>
 - variables which can be used in Makefile.am or Makefile.in like this:
 - </p>
 - <pre>
 -         SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@
 -         SAMPLERATE_LIBS = @SAMPLERATE_LIBS@
 - </pre>
 - 
 - <p>
 - If you install libsamplerate from source, you will probably need to set the
 - <b>PKG_CONFIG_PATH</b> environment variable's suggested at the end of the
 - libsamplerate configure process. For instance on my system I get this:
 - </p>
 - <pre>
 -     -=-=-=-=-=-=-=-=-=-= Configuration Complete =-=-=-=-=-=-=-=-=-=-=-
 - 
 -       Configuration summary :
 - 
 -         Version : ..................... 0.1.3
 -         Enable debugging : ............ no
 - 
 -       Tools :
 - 
 -         Compiler is GCC : ............. yes
 -         GCC major version : ........... 3
 - 
 -       Extra tools required for testing and examples :
 - 
 -         Have FFTW : ................... yes
 -         Have libsndfile : ............. yes
 -         Have libefence : .............. no
 - 
 -       Installation directories :
 - 
 -         Library directory : ........... /usr/local/lib
 -         Program directory : ........... /usr/local/bin
 -         Pkgconfig directory : ......... /usr/local/lib/pkgconfig
 - </pre>
 - 
 - 
 - <!-- pepper -->
 - <!-- ========================================================================= -->
 - <A NAME="Q003"></A>
 - <H2><BR><B>Q3 : If I upsample and downsample to the original rate, for
 - 	example 44.1->96->44.1, do I get an identical signal as the one before the
 - 	up/down resampling?</B></H2>
 - <P>
 - The short answer is that for the general case, no, you don't.
 - The long answer is that for some signals, with some converters, you will
 - get very, very close.
 - </P>
 - <P>
 - In order to resample correctly (ie using the <B>SRC_SINC_*</B> converters),
 - filtering needs to be applied, regardless of whether its upsampling or
 - downsampling.
 - This filter needs to attenuate all frequencies above 0.5 times the minimum of
 - the source and destination sample rate (call this fshmin).
 - Since the filter needed to achieve full attenuation at this point, it has to
 - start rolling off a some frequency below this point.
 - It is this rolloff of the very highest frequencies which causes some of the
 - loss.
 - </P>
 - <P>
 - The other factor is that the filter itself can introduce transient artifacts
 - which causes the output to be different to the input.
 - </P>
 - 
 - <!-- pepper -->
 - <!-- ========================================================================= -->
 - <A NAME="Q004"></A>
 - <H2><BR><B>Q4 : If I ran src_simple on small chunks (say 160 frames) would that
 - sound bad?</B></H2>
 - <P>
 - Well if you are after odd sound effects, it might sound OK.
 - If you are after high quality sample rate conversion you will be disappointed.
 - </P>
 - <P>
 - The src_simple() was designed to provide a simple to use interface for people
 - who wanted to do sample rate conversion on say, a whole file all at once.
 - </P>
 - 
 - <!-- pepper -->
 - <!-- ========================================================================= -->
 - <A NAME="Q005"></A>
 - <H2><BR><B>Q5 : I'm using libsamplerate but the high quality settings
 - 	sound worse than the SRC_LINEAR converter. Why?</B></H2>
 - <P>
 - There are two possible problems.
 - Firstly, if you are using the src_simple() function on successive blocks
 - of a stream of samples, you will get bad results. The src_simple() function
 - is designed for use on a whole sound file, all at once, not on contiguous
 - segments of the same sound file.
 - To fix the problem, you need to move to the src_process() API or the callback
 - based API.
 - </P>
 - <P>
 - If you are already using the src_process() API or the callback based API and
 - the high quality settings sound worse than SRC_LINEAR, then you have other
 - problems.
 - Read on for more debugging hints.
 - </P>
 - <P>
 - All of the higher quality converters need to keep state while doing conversions
 - on segments of a large chunk of audio.
 - This state information is kept inside the private data pointed to by the
 - SRC_STATE pointer returned by the src_new() function.
 - This means, that when you want to start doing sample rate conversion on a
 - stream of data, you should call src_new() to get a new SRC_STATE pointer
 - (or alternatively, call src_reset() on an existing SRC_STATE pointer).
 - You should then pass this SRC_STATE pointer to the src_process() function
 - with each new block of audio data.
 - When you have completed the conversion, you can then call src_delete() on
 - the SRC_STATE pointer.
 - </P>
 - <P>
 - If you are doing all of the above correctly, you need to examine your usage
 - of the values passed to src_process() in the
 - 	<A HREF="api_misc.html#SRC_DATA">SRC_DATA</A>
 - struct.
 - Specifically:
 - </P>
 - <UL>
 - 	<LI> Check that input_frames and output_frames fields are being set in
 - 			terms of frames (number of sample values times channels) instead
 - 			of just the number of samples.
 - 	<LI> Check that you are using the return values input_frames_used and
 - 			output_frames_gen to update your source and destination pointers
 - 			correctly.
 - 	<LI> Check that you are updating the data_in and data_out pointers
 - 			correctly for each successive call.
 - </UL>
 - <P>
 - While doing the above, it is probably useful to compare what you are doing to
 - what is done in the example programs in the examples/ directory of the source
 - code tarball.
 - </P>
 - <P>
 - If you have done all of the above and are still having problems then its
 - probably time to email the author with the smallest chunk of code that
 - adequately demonstrates your problem.
 - This chunk should not need to be any more than 100 lines of code.
 - </P>
 - 
 - <!-- pepper -->
 - <!-- ========================================================================= -->
 - <A NAME="Q006"></A>
 - <H2><BR><B>Q6 : I'm use the SRC_SINC_* converters and up-sampling by a ratio of 
 - 	2. I reset the converter and put in 1000 samples and I expect to get 2000
 - 	samples out, but I'm getting less than that. Why?</B></H2>
 - <P>
 - The short answer is that there is a transport delay inside the converter itself.
 - Long answer follows.
 - </P>
 - <P>
 - By way of example, the first time you call src_process() you might only get 1900
 - samples out.
 - However, after that first call all subsequent calls will probably get you about
 - 2000 samples out for every 1000 samples you put in.
 - </P>
 - <P>
 - The main problems people have with this transport delay is that they need to read
 - out an exact number of samples and the transport delay scews this up.
 - The best way to overcome this problem is to always supply more samples on the 
 - input than is actually needed to create the required number of output samples.
 - With reference to the example above, if you always supply 1500 samples at the
 - input, you will always get 2000 samples at the output.
 - You will always need to keep track of the number of input frames used on each
 - call to src_process() and deal with these values appropriately.
 - </P>
 - 
 - <!-- pepper -->
 - <!-- ========================================================================= -->
 - <A NAME="Q007"></A>
 - <H2><BR><B>Q7 : I have input and output sample rates that are integer
 - 	values, but the API wants me to divide one by the other and put the result
 - 	in a floating point number. Won't this case problems for long running
 - 	conversions?</B></H2>
 - <P>
 - The short answer is no, the precision of the ratio is many orders of magnitude
 - more than is really needed.
 - </P>
 - <P>
 - For the long answer, lets do come calculations.
 - Firstly, the <tt>src_ratio</tt> field is double precision floating point number
 - which has
 - 	<a href="http://en.wikipedia.org/wiki/Double_precision">
 - 	53 bits of precision</a>.
 - </P>
 - <P>
 - That means that the maximum error in your ratio converted to a double is one
 - bit in 2^53 which means the the double float value would be wrong by one sample
 - after 9007199254740992 samples have passed or wrong by more than half a sample
 - wrong after half that many (4503599627370496 samples) have passed.
 - </P>
 - <P>
 - Now if for example our output sample rate is 96kHz then
 - </P>
 - <pre>
 -     4503599627370496 samples at 96kHz is 46912496118 seconds
 -     46912496118 seconds is 781874935 minutes
 -     781874935 minutes is 13031248 hours
 -     13031248 hours is 542968 days
 -     542968 days is 1486 years
 - </pre>
 - <P>
 - So, after 1486 years, the input will be wrong by more than half of one sampling
 - period.
 - </P>
 - <p>
 - All this assumes that the crystal oscillators uses to sample the audio stream
 - is perfect.
 - This is not the case.
 - According to
 - 	<a href="http://www.ieee-uffc.org/freqcontrol/quartz/vig/vigcomp.htm">
 - 	this web site</a>,
 - the accuracy of standard crystal oscillators (XO, TCXO, OCXO) is at best
 - 1 in 100 million.
 - The <tt>src_ratio</tt> is therefore 45035996 times more accurate than the
 - crystal clock source used to sample the original audio signal and any potential
 - problem with the <tt>src_ratio</tt> being a floating point number will be
 - completely swamped by sampling inaccuracies.
 - </p>
 - 
 - <!-- <A HREF="mailto:aldel@mega-nerd.com">For the spam bots</A> -->
 - 
 - </DIV>
 - </TD></TR>
 - </TABLE>
 - 
 - </BODY>
 - </HTML>
 
 
  |