]> git.rkrishnan.org Git - dttsp.git/blob - jDttSP/speechproc.c
505304d10e8c2986fbbdbf491632d1ad01a9ec1b
[dttsp.git] / jDttSP / speechproc.c
1 /* speechproc.c
2    
3   This file is part of a program that implements a Software-Defined Radio.
4
5 Copyright (C) 2004 by Frank Brickle, AB2KT and Bob McGwier, N4HY
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
21 The authors can be reached by email at
22
23 ab2kt@arrl.net
24 or
25 rwmcgwier@comcast.net
26
27 or by paper mail at
28
29 The DTTS Microwave Society
30 6 Kathleen Place
31 Bridgewater, NJ 08807
32 */
33
34 #include <speechproc.h>
35
36 SpeechProc
37 newSpeechProc(REAL K, REAL MaxCompression, COMPLEX *spdat, int size) {
38   SpeechProc sp = (SpeechProc) safealloc(1, sizeof(speech_proc), "new speech processor");
39   sp->CG = newRLB(size, NULL, "CG buffer in Speech Processor");
40   sp->K = K;
41   sp->MaxGain = pow(10.0, MaxCompression * 0.05);
42   sp->LastCG = 1.0;
43   sp->SpeechProcessorBuffer = newCXB(size, spdat, "speech processor data");
44   sp->size = size;
45   return sp;
46 }
47
48 void
49 delSpeechProc(SpeechProc sp) {
50   if (sp) {
51     delCXB(sp->SpeechProcessorBuffer);
52     safefree((char *) sp);
53   }
54 }
55
56 void
57 SpeechProcessor(SpeechProc sp) {
58   int i;
59   REAL r = 0.0, Mag;
60   for (i = 0; i < sp->size; i++)
61     r = max(r, Cmag(CXBdata(sp->SpeechProcessorBuffer, i)));
62   Mag = Cmag(CXBdata(sp->SpeechProcessorBuffer, 0));
63   if (Mag > 0.0) {
64     RLBdata(sp->CG, 0) = sp->LastCG * (1.0 - sp->K) + (sp->K * r / Mag);
65     if (RLBdata(sp->CG, 0) > sp->MaxGain)
66       RLBdata(sp->CG, 0) = sp->MaxGain;
67   } else
68     RLBdata(sp->CG, 0) = 1.0;
69   for (i = 1; i < sp->size; i++) {
70     Mag = Cmag(CXBdata(sp->SpeechProcessorBuffer, i));
71     if (Mag > 0.0) {
72       RLBdata(sp->CG, i) =
73         RLBdata(sp->CG, i - 1) * (1 - sp->K) + (sp->K * r / Mag);
74       if (RLBdata(sp->CG, i) > sp->MaxGain)
75         RLBdata(sp->CG, i) = sp->MaxGain;
76     } else
77       RLBdata(sp->CG, i) = 1.0;
78   }
79   sp->LastCG = RLBdata(sp->CG, sp->size - 1);
80   for (i = 0; i < sp->size; i++)
81     CXBdata(sp->SpeechProcessorBuffer, i) =
82       Cscl(CXBdata(sp->SpeechProcessorBuffer, i), RLBdata(sp->CG, i));
83 }