annotate src/libsamplerate-0.1.9/tests/varispeed_test.c @ 128:5b4145a0d408

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