aboutsummaryrefslogtreecommitdiff
path: root/examples/simpletest
diff options
context:
space:
mode:
authorJamie Bullock <jamie@jamiebullock.com>2013-06-02 22:55:18 +0100
committerJamie Bullock <jamie@jamiebullock.com>2013-06-02 22:55:18 +0100
commitab2b612c64623de1a77d3c257d9ae8ea12aa6ea1 (patch)
tree775e54d39f2eb7e4a7ee2187b0f6fb3e9b1e319d /examples/simpletest
parent4d4231f47627d56fcb636dbd8fb0687118ee37f9 (diff)
downloadLibXtract-ab2b612c64623de1a77d3c257d9ae8ea12aa6ea1.tar.gz
LibXtract-ab2b612c64623de1a77d3c257d9ae8ea12aa6ea1.tar.bz2
LibXtract-ab2b612c64623de1a77d3c257d9ae8ea12aa6ea1.zip
More xtract functions included in simpletest example
Diffstat (limited to 'examples/simpletest')
-rw-r--r--examples/simpletest/simpletest.c112
1 files changed, 96 insertions, 16 deletions
diff --git a/examples/simpletest/simpletest.c b/examples/simpletest/simpletest.c
index d895944..07a2f69 100644
--- a/examples/simpletest/simpletest.c
+++ b/examples/simpletest/simpletest.c
@@ -24,48 +24,128 @@
#include "xtract/libxtract.h"
#include <stdio.h>
#include <stdlib.h>
+#include <math.h>
+
+typedef enum waveform_type_
+{
+ SINE,
+ SAWTOOTH,
+ SQUARE
+}
+waveform_type;
#define BLOCKSIZE 1024
#define SAMPLERATE 44100
-#define PERIOD 100
+#define PERIOD 102
#define MFCC_FREQ_BANDS 13
#define MFCC_FREQ_MIN 20
#define MFCC_FREQ_MAX 20000
-int main(void)
+
+double wavetable[BLOCKSIZE];
+
+void fill_wavetable(const float frequency, waveform_type type)
{
- double mean = 0.f;
- double input[BLOCKSIZE];
+ int samples_per_period = SAMPLERATE / frequency;
+
+ for (int i = 0; i < BLOCKSIZE; ++i)
+ {
+ int phase = i % samples_per_period;
+
+ switch (type)
+ {
+ case SINE:
+ wavetable[i] = sin((phase / (double)PERIOD) * 2 * M_PI);
+ break;
+ case SQUARE:
+ if (phase < (samples_per_period / 2.f))
+ {
+ wavetable[i] = -1.0;
+ }
+ else
+ {
+ wavetable[i] = 1.0;
+ }
+ break;
+ case SAWTOOTH:
+ wavetable[i] = ((phase / (double)PERIOD) * 2) - 1.;
+ break;
+ }
+ }
+}
+
+void print_wavetable(void)
+{
+ for (int i = 0; i < BLOCKSIZE; ++i)
+ {
+ printf("%f\n", wavetable[i]);
+ }
+}
+
+int main(void)
+{
+ double mean = 0.0;
+ double f0 = 0.0;
+ double centroid = 0.0;
double spectrum[BLOCKSIZE];
+ double windowed[BLOCKSIZE];
+ double peaks[BLOCKSIZE];
+ double harmonics[BLOCKSIZE];
+ double *window = NULL;
double mfccs[MFCC_FREQ_BANDS * sizeof(double)];
double argd[4];
+ double samplerate = 44100.0;
int n;
xtract_mel_filter mel_filters;
- /* fill the input array with a sawtooth wave */
- for(n = 0; n < BLOCKSIZE; ++n)
- {
- input[n] = ((n % PERIOD) / (double)PERIOD) - .5;
- }
+ fill_wavetable(344.53125f, SINE); // 344.53125f = 128 samples @ 44100 Hz
+ print_wavetable();
+
+ /* get the F0 */
+ xtract[XTRACT_WAVELET_F0](wavetable, BLOCKSIZE, &samplerate, &f0);
+ printf("\nF0: %f\n", f0);
/* get the mean of the input */
- xtract[XTRACT_MEAN](input, BLOCKSIZE, NULL, &mean);
- printf("\nInput mean = %.2f\n\n", mean);
+ xtract[XTRACT_MEAN](wavetable, BLOCKSIZE, NULL, &mean);
+ printf("\nInput mean = %.2f\n\n", mean); /* We expect this to be zero for a square wave */
+
+ /* create the window function */
+ window = xtract_init_window(BLOCKSIZE, XTRACT_HANN);
+ xtract_windowed(wavetable, BLOCKSIZE, window, windowed);
/* get the spectrum */
argd[0] = SAMPLERATE / (double)BLOCKSIZE;
argd[1] = XTRACT_MAGNITUDE_SPECTRUM;
- argd[2] = 0.f; /* No DC component */
+ argd[2] = 0.f; /* DC component - we expect this to zero for square wave */
argd[3] = 0.f; /* No Normalisation */
xtract_init_fft(BLOCKSIZE, XTRACT_SPECTRUM);
- xtract[XTRACT_SPECTRUM](input, BLOCKSIZE, &argd[0], spectrum);
+ xtract[XTRACT_SPECTRUM](windowed, BLOCKSIZE, &argd[0], spectrum);
+
+ xtract[XTRACT_SPECTRAL_CENTROID](spectrum, BLOCKSIZE, NULL, &centroid);
+ printf("\nSpectral Centroid: %f\n", centroid);
+
+ argd[1] = 10.0; /* peak threshold as % of maximum peak */
+ xtract[XTRACT_PEAK_SPECTRUM](spectrum, BLOCKSIZE / 2, argd, peaks);
+
+ argd[0] = f0;
+ argd[1] = .3; /* harmonic threshold */
+ xtract[XTRACT_HARMONIC_SPECTRUM](peaks, BLOCKSIZE, argd, harmonics);
/* print the spectral bins */
- printf("\nSpectral bins:\n");
- for(n = 0; n < (BLOCKSIZE >> 1); ++n){
- printf("freq: %.1f\tamp: %.6f\n", spectrum[n + (BLOCKSIZE >> 1)], spectrum[n]);
+ printf("\nSpectrum:\n");
+ for(n = 0; n < (BLOCKSIZE >> 1); ++n)
+ {
+ printf("freq: %.1f\tamp: %.6f", spectrum[n + (BLOCKSIZE >> 1)], spectrum[n]);
+ if (peaks[n + (BLOCKSIZE >> 1)] != 0.f)
+ {
+ printf("\tpeak:: freq: %.1f\tamp: %.6f\n", peaks[n + (BLOCKSIZE >> 1)], peaks[n]);
+ }
+ else
+ {
+ printf("\n");
+ }
}
printf("\n");