3 This file is part of a program that implements a Software-Defined Radio.
5 Copyright (C) 2004 by Frank Brickle, AB2KT and Bob McGwier, N4HY
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.
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.
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
21 The authors can be reached by email at
29 The DTTS Microwave Society
34 #include <speechproc.h>
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");
41 sp->MaxGain = pow(10.0, MaxCompression * 0.05);
43 sp->SpeechProcessorBuffer = newCXB(size, spdat, "speech processor data");
49 delSpeechProc(SpeechProc sp) {
51 delCXB(sp->SpeechProcessorBuffer);
52 safefree((char *) sp);
57 SpeechProcessor(SpeechProc sp) {
60 for (i = 0; i < sp->size; i++)
61 r = max(r, Cmag(CXBdata(sp->SpeechProcessorBuffer, i)));
62 Mag = Cmag(CXBdata(sp->SpeechProcessorBuffer, 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;
68 RLBdata(sp->CG, 0) = 1.0;
69 for (i = 1; i < sp->size; i++) {
70 Mag = Cmag(CXBdata(sp->SpeechProcessorBuffer, 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;
77 RLBdata(sp->CG, i) = 1.0;
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));