annotate src/libsamplerate-0.1.9/tests/varispeed_test.c @ 56:af97cad61ff0

Add updated build of PortAudio for OSX
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 03 Jan 2017 15:10:52 +0000
parents 481f5f8c5634
children
rev   line source
Chris@41 1 /*
Chris@41 2 ** Copyright (c) 2006-2016, Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@41 3 ** All rights reserved.
Chris@41 4 **
Chris@41 5 ** This code is released under 2-clause BSD license. Please see the
Chris@41 6 ** file at : https://github.com/erikd/libsamplerate/blob/master/COPYING
Chris@41 7 */
Chris@41 8
Chris@41 9 #include "config.h"
Chris@41 10
Chris@41 11 #include <stdio.h>
Chris@41 12 #include <stdlib.h>
Chris@41 13 #include <math.h>
Chris@41 14 #include <string.h>
Chris@41 15
Chris@41 16 #include <samplerate.h>
Chris@41 17
Chris@41 18 #include "util.h"
Chris@41 19
Chris@41 20 #if HAVE_FFTW3
Chris@41 21 #include <fftw3.h>
Chris@41 22 #else
Chris@41 23 #define fftw_cleanup()
Chris@41 24 #endif
Chris@41 25
Chris@41 26 #define BUFFER_LEN (1 << 16)
Chris@41 27
Chris@41 28 static void varispeed_test (int converter, double target_snr) ;
Chris@41 29
Chris@41 30 int
Chris@41 31 main (void)
Chris@41 32 {
Chris@41 33 puts ("") ;
Chris@41 34 printf (" Zero Order Hold interpolator : ") ;
Chris@41 35 varispeed_test (SRC_ZERO_ORDER_HOLD, 10.0) ;
Chris@41 36
Chris@41 37 printf (" Linear interpolator : ") ;
Chris@41 38 varispeed_test (SRC_LINEAR, 10.0) ;
Chris@41 39
Chris@41 40 printf (" Sinc interpolator : ") ;
Chris@41 41 varispeed_test (SRC_SINC_FASTEST, 115.0) ;
Chris@41 42
Chris@41 43 fftw_cleanup () ;
Chris@41 44 puts ("") ;
Chris@41 45
Chris@41 46 return 0 ;
Chris@41 47 } /* main */
Chris@41 48
Chris@41 49 static void
Chris@41 50 varispeed_test (int converter, double target_snr)
Chris@41 51 { static float input [BUFFER_LEN], output [BUFFER_LEN] ;
Chris@41 52 double sine_freq, snr ;
Chris@41 53
Chris@41 54 SRC_STATE *src_state ;
Chris@41 55 SRC_DATA src_data ;
Chris@41 56
Chris@41 57 int input_len, error ;
Chris@41 58
Chris@41 59 memset (input, 0, sizeof (input)) ;
Chris@41 60
Chris@41 61 input_len = ARRAY_LEN (input) / 2 ;
Chris@41 62
Chris@41 63 sine_freq = 0.0111 ;
Chris@41 64 gen_windowed_sines (1, &sine_freq, 1.0, input, input_len) ;
Chris@41 65
Chris@41 66 /* Perform sample rate conversion. */
Chris@41 67 if ((src_state = src_new (converter, 1, &error)) == NULL)
Chris@41 68 { printf ("\n\nLine %d : src_new() failed : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@41 69 exit (1) ;
Chris@41 70 } ;
Chris@41 71
Chris@41 72 src_data.end_of_input = 1 ;
Chris@41 73
Chris@41 74 src_data.data_in = input ;
Chris@41 75 src_data.input_frames = input_len ;
Chris@41 76
Chris@41 77 src_data.src_ratio = 3.0 ;
Chris@41 78
Chris@41 79 src_data.data_out = output ;
Chris@41 80 src_data.output_frames = ARRAY_LEN (output) ;
Chris@41 81
Chris@41 82 if ((error = src_set_ratio (src_state, 1.0 / src_data.src_ratio)))
Chris@41 83 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@41 84 exit (1) ;
Chris@41 85 } ;
Chris@41 86
Chris@41 87 if ((error = src_process (src_state, &src_data)))
Chris@41 88 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@41 89 printf (" src_data.input_frames : %ld\n", src_data.input_frames) ;
Chris@41 90 printf (" src_data.output_frames : %ld\n\n", src_data.output_frames) ;
Chris@41 91 exit (1) ;
Chris@41 92 } ;
Chris@41 93
Chris@41 94 if (src_data.input_frames_used != input_len)
Chris@41 95 { printf ("\n\nLine %d : unused input.\n", __LINE__) ;
Chris@41 96 printf ("\tinput_len : %d\n", input_len) ;
Chris@41 97 printf ("\tinput_frames_used : %ld\n\n", src_data.input_frames_used) ;
Chris@41 98 exit (1) ;
Chris@41 99 } ;
Chris@41 100
Chris@41 101 /* Copy the last output to the input. */
Chris@41 102 memcpy (input, output, sizeof (input)) ;
Chris@41 103 reverse_data (input, src_data.output_frames_gen) ;
Chris@41 104
Chris@41 105 if ((error = src_reset (src_state)))
Chris@41 106 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@41 107 exit (1) ;
Chris@41 108 } ;
Chris@41 109
Chris@41 110 src_data.end_of_input = 1 ;
Chris@41 111
Chris@41 112 src_data.data_in = input ;
Chris@41 113 input_len = src_data.input_frames = src_data.output_frames_gen ;
Chris@41 114
Chris@41 115 src_data.data_out = output ;
Chris@41 116 src_data.output_frames = ARRAY_LEN (output) ;
Chris@41 117
Chris@41 118 if ((error = src_set_ratio (src_state, 1.0 / src_data.src_ratio)))
Chris@41 119 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@41 120 exit (1) ;
Chris@41 121 } ;
Chris@41 122
Chris@41 123 if ((error = src_process (src_state, &src_data)))
Chris@41 124 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@41 125 printf (" src_data.input_frames : %ld\n", src_data.input_frames) ;
Chris@41 126 printf (" src_data.output_frames : %ld\n\n", src_data.output_frames) ;
Chris@41 127 exit (1) ;
Chris@41 128 } ;
Chris@41 129
Chris@41 130 if (src_data.input_frames_used != input_len)
Chris@41 131 { printf ("\n\nLine %d : unused input.\n", __LINE__) ;
Chris@41 132 printf ("\tinput_len : %d\n", input_len) ;
Chris@41 133 printf ("\tinput_frames_used : %ld\n\n", src_data.input_frames_used) ;
Chris@41 134 exit (1) ;
Chris@41 135 } ;
Chris@41 136
Chris@41 137 src_state = src_delete (src_state) ;
Chris@41 138
Chris@41 139 snr = calculate_snr (output, src_data.output_frames_gen, 1) ;
Chris@41 140
Chris@41 141 if (target_snr > snr)
Chris@41 142 { printf ("\n\nLine %d : snr (%3.1f) does not meet target (%3.1f)\n\n", __LINE__, snr, target_snr) ;
Chris@41 143 save_oct_float ("varispeed.mat", input, src_data.input_frames, output, src_data.output_frames_gen) ;
Chris@41 144 exit (1) ;
Chris@41 145 } ;
Chris@41 146
Chris@41 147 puts ("ok") ;
Chris@41 148
Chris@41 149 return ;
Chris@41 150 } /* varispeed_test */
Chris@41 151