diff spandsp-0.0.3/spandsp-0.0.3/tests/make_g168_css.c @ 5:f762bf195c4b

import spandsp-0.0.3
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 16:00:21 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spandsp-0.0.3/spandsp-0.0.3/tests/make_g168_css.c	Fri Jun 25 16:00:21 2010 +0200
@@ -0,0 +1,387 @@
+/*
+ * SpanDSP - a series of DSP components for telephony
+ *
+ * makecss.c - Create the composite source signal (CSS) for G.168 testing.
+ *
+ * Written by Steve Underwood <steveu@coppice.org>
+ *
+ * Copyright (C) 2003 Steve Underwood
+ *
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id: make_g168_css.c,v 1.9 2006/11/19 14:07:27 steveu Exp $
+ */
+
+/*! \page makecss_page CSS construction for G.168 testing
+\section makecss_page_sec_1 What does it do?
+???.
+
+\section makecss_page_sec_2 How does it work?
+???.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <inttypes.h>
+#include <string.h>
+#include <time.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <audiofile.h>
+#include <tiffio.h>
+#if defined(HAVE_FFTW3_H)
+#include <fftw3.h>
+#else
+#include <fftw.h>
+#endif
+#if defined(HAVE_TGMATH_H)
+#include <tgmath.h>
+#endif
+#if defined(HAVE_MATH_H)
+#define GEN_CONST
+#include <math.h>
+#endif
+
+#include "spandsp.h"
+#include "spandsp/g168models.h"
+
+#if !defined(NULL)
+#define NULL (void *) 0
+#endif
+
+#define FAST_SAMPLE_RATE    44100.0
+
+static double scaling(double f, double start, double end, double start_gain, double end_gain)
+{
+    double scale;
+
+    scale = start_gain + (f - start)*(end_gain - start_gain)/(end - start);
+    return scale;
+}
+
+int main(int argc, char *argv[])
+{
+#if defined(HAVE_FFTW3_H)
+    double in[8192][2];
+    double out[8192][2];
+#else
+    fftw_complex in[8192];
+    fftw_complex out[8192];
+#endif
+    fftw_plan p;
+    int16_t voiced_sound[8192];
+    int16_t noise_sound[8192];
+    int16_t silence_sound[8192];
+    int i;
+    int j;
+    int outframes;
+    int voiced_length;
+    float f;
+    double peak;
+    double ms;
+    double scale;
+    AFfilehandle filehandle;
+    AFfilesetup filesetup;
+    awgn_state_t noise_source;
+
+    filesetup = afNewFileSetup();
+    if (filesetup == AF_NULL_FILESETUP)
+    {
+        fprintf(stderr, "    Failed to create file setup\n");
+        exit(2);
+    }
+    afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16);
+    afInitRate(filesetup, AF_DEFAULT_TRACK, FAST_SAMPLE_RATE);
+    afInitFileFormat(filesetup, AF_FILE_WAVE);
+    afInitChannels(filesetup, AF_DEFAULT_TRACK, 1);
+    filehandle = afOpenFile("sound_c1.wav", "w", filesetup);
+    if (filehandle == AF_NULL_FILEHANDLE)
+    {
+        fprintf(stderr, "    Failed to open result file\n");
+        exit(2);
+    }
+
+    for (i = 0;  i < (int)(sizeof(css_c1)/sizeof(css_c1[0]));  i++)
+        voiced_sound[i] = css_c1[i];
+    voiced_length = i;
+
+    ms = 0;
+    peak = 0;
+    for (i = 0;  i < voiced_length;  i++)
+    {
+        if (abs(voiced_sound[i]) > peak)
+            peak = abs(voiced_sound[i]);
+        ms += voiced_sound[i]*voiced_sound[i];
+    }
+    ms = 20.0*log10(sqrt(ms/voiced_length)/32767.0) + DBM0_MAX_POWER;
+    printf("Voiced level = %.2fdB\n", ms);
+
+#if defined(HAVE_FFTW3_H)    
+    p = fftw_plan_dft_1d(8192, in, out, FFTW_BACKWARD, FFTW_ESTIMATE);
+#else
+    p = fftw_create_plan(8192, FFTW_BACKWARD, FFTW_ESTIMATE);
+#endif
+    for (i = 0;  i < 8192;  i++)
+    {
+#if defined(HAVE_FFTW3_H)
+        in[i][0] = 0.0;
+        in[i][1] = 0.0;
+#else
+        in[i].re = 0.0;
+        in[i].im = 0.0;
+#endif
+    }
+    for (i = 1;  i <= 3715;  i++)
+    {
+        f = FAST_SAMPLE_RATE*i/8192.0;
+
+#if 1
+        if (f < 50.0)
+            scale = -60.0;
+        else if (f < 100.0)
+            scale = scaling(f, 50.0, 100.0, -25.8, -12.8);
+        else if (f < 200.0)
+            scale = scaling(f, 100.0, 200.0, -12.8, 17.4);
+        else if (f < 215.0)
+            scale = scaling(f, 200.0, 215.0, 17.4, 17.8);
+        else if (f < 500.0)
+            scale = scaling(f, 215.0, 500.0, 17.8, 12.2);
+        else if (f < 1000.0)
+            scale = scaling(f, 500.0, 1000.0, 12.2, 7.2);
+        else if (f < 2850.0)
+            scale = scaling(f, 1000.0, 2850.0, 7.2, 0.0);
+        else if (f < 3600.0)
+            scale = scaling(f, 2850.0, 3600.0, 0.0, -2.0);
+        else if (f < 3660.0)
+            scale = scaling(f, 3600.0, 3660.0, -2.0, -20.0);
+        else if (f < 3680.0)
+            scale = scaling(f, 3600.0, 3680.0, -20.0, -30.0);
+        else
+            scale = -60.0;
+#else
+        scale = 0.0;
+#endif
+#if defined(HAVE_FFTW3_H)    
+        in[i][0] = 0.0;
+        in[i][1] = (rand() & 0x1)  ?  1.0  :  -1.0;
+        in[i][1] *= pow(10.0, scale/20.0);
+        in[i][1] *= 35.0; //305360
+        //printf("%10d %15.5f %15.5f\n", i, in[i].re, in[i].im);
+        in[8192 - i][0] = 0.0;
+        in[8192 - i][1] = -in[i][1];
+        //printf("%10d %15.5f %15.5f\n", i, in[i][0], in[i][1]);
+#else
+        in[i].re = 0.0;
+        in[i].im = (rand() & 0x1)  ?  1.0  :  -1.0;
+        in[i].im *= pow(10.0, scale/20.0);
+        in[i].im *= 35.0; //305360
+        in[8192 - i].re = 0.0;
+        in[8192 - i].im = -in[i].im;
+        //printf("%10d %15.5f %15.5f\n", i, in[i].re, in[i].im);
+#endif
+    }
+#if defined(HAVE_FFTW3_H)    
+    fftw_execute(p);
+#else
+    fftw_one(p, in, out);
+#endif
+    for (i = 0;  i < 8192;  i++)
+    {
+        //printf("%10d %15.5f %15.5f\n", i, out[i].re, out[i].im);
+#if defined(HAVE_FFTW3_H)    
+        noise_sound[i] = out[i][0];
+#else
+        noise_sound[i] = out[i].re;
+#endif
+    }
+
+    peak = 0;
+    ms = 0;
+    for (i = 0;  i < 8192;  i++)
+    {
+        if (abs(noise_sound[i]) > peak)
+            peak = abs(noise_sound[i]);
+        ms += noise_sound[i]*noise_sound[i];
+    }
+    printf("Noise level = %.2fdB\n", 20.0*log10(sqrt(ms/8192.0)/32767.0) + DBM0_MAX_POWER);
+    printf("Crest factor = %.2fdB\n", 20.0*log10(peak/sqrt(ms/8192.0)));
+    
+    for (i = 0;  i < 8192;  i++)
+        silence_sound[i] = 0.0;
+
+    for (j = 0;  j < 16;  j++)
+    {
+        outframes = afWriteFrames(filehandle,
+                                  AF_DEFAULT_TRACK,
+                                  voiced_sound,
+                                  voiced_length);
+    }
+    printf("%d samples of voice\n", 16*voiced_length);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              noise_sound,
+                              8192);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              noise_sound,
+                              8820 - 8192);
+    printf("%d samples of noise\n", 8820);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              silence_sound,
+                              4471);
+    printf("%d samples of silence\n", 4471);
+
+    for (j = 0;  j < voiced_length;  j++)
+        voiced_sound[j] = -voiced_sound[j];
+    for (j = 0;  j < 8192;  j++)
+        noise_sound[j] = -noise_sound[j];
+
+    for (j = 0;  j < 16;  j++)
+    {
+        outframes = afWriteFrames(filehandle,
+                                  AF_DEFAULT_TRACK,
+                                  voiced_sound,
+                                  voiced_length);
+    }
+    printf("%d samples of voice\n", 16*voiced_length);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              noise_sound,
+                              8192);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              noise_sound,
+                              8820 - 8192);
+    printf("%d samples of noise\n", 8820);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              silence_sound,
+                              4471);
+    printf("%d samples of silence\n", 4471);
+
+    if (afCloseFile(filehandle) != 0)
+    {
+        fprintf(stderr, "    Cannot close speech file '%s'\n", "sound_c1.wav");
+        exit(2);
+    }
+
+    afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16);
+    afInitRate(filesetup, AF_DEFAULT_TRACK, FAST_SAMPLE_RATE);
+    afInitFileFormat(filesetup, AF_FILE_WAVE);
+    afInitChannels(filesetup, AF_DEFAULT_TRACK, 1);
+    filehandle = afOpenFile("sound_c3.wav", "w", filesetup);
+    if (filehandle == AF_NULL_FILEHANDLE)
+    {
+        fprintf(stderr, "    Failed to open result file\n");
+        exit(2);
+    }
+
+    for (i = 0;  i < (int) (sizeof(css_c3)/sizeof(css_c3[0]));  i++)
+        voiced_sound[i] = css_c3[i];
+    voiced_length = i;
+
+    ms = 0;
+    for (i = 0;  i < voiced_length;  i++)
+    {
+        if (abs(voiced_sound[i]) > peak)
+            peak = abs(voiced_sound[i]);
+        ms += voiced_sound[i]*voiced_sound[i];
+    }
+    ms = 20.0*log10(sqrt(ms/voiced_length)/32767.0) + DBM0_MAX_POWER;
+    printf("Voiced level = %.2fdB\n", ms);
+
+    awgn_init_dbm0(&noise_source, 7162534, ms);
+    for (i = 0;  i < 8192;  i++)
+        noise_sound[i] = awgn(&noise_source);
+    peak = 0;
+    ms = 0;
+    for (i = 0;  i < 8192;  i++)
+    {
+        if (abs(noise_sound[i]) > peak)
+            peak = abs(noise_sound[i]);
+        ms += noise_sound[i]*noise_sound[i];
+    }
+    printf("Noise level = %.2fdB\n", 20.0*log10(sqrt(ms/8192.0)/32767.0) + DBM0_MAX_POWER);
+    printf("Crest factor = %.2fdB\n", 20.0*log10(peak/sqrt(ms/8192.0)));
+
+    for (j = 0;  j < 14;  j++)
+    {
+        outframes = afWriteFrames(filehandle,
+                                  AF_DEFAULT_TRACK,
+                                  voiced_sound,
+                                  voiced_length);
+    }
+    printf("%d samples of voice\n", 14*i);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              noise_sound,
+                              8192);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              noise_sound,
+                              8820 - 8192);
+    printf("%d samples of noise\n", 8820);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              silence_sound,
+                              5614);
+    printf("%d samples of silence\n", 5614);
+
+    for (j = 0;  j < voiced_length;  j++)
+        voiced_sound[j] = -voiced_sound[j];
+    for (j = 0;  j < 8192;  j++)
+        noise_sound[j] = -noise_sound[j];
+
+    for (j = 0;  j < 14;  j++)
+    {
+        outframes = afWriteFrames(filehandle,
+                                  AF_DEFAULT_TRACK,
+                                  voiced_sound,
+                                  voiced_length);
+    }
+    printf("%d samples of voice\n", 14*i);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              noise_sound,
+                              8192);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              noise_sound,
+                              8820 - 8192);
+    printf("%d samples of noise\n", 8820);
+    outframes = afWriteFrames(filehandle,
+                              AF_DEFAULT_TRACK,
+                              silence_sound,
+                              5614);
+    printf("%d samples of silence\n", 5614);
+
+    if (afCloseFile(filehandle) != 0)
+    {
+        fprintf(stderr, "    Cannot close speech file '%s'\n", "sound_c3.wav");
+        exit(2);
+    }
+    afFreeFileSetup(filesetup);
+
+    fftw_destroy_plan(p);
+    return  0;
+}
+/*- End of function --------------------------------------------------------*/
+/*- End of file ------------------------------------------------------------*/

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.