tomwalters@116
|
1 /*!
|
tomwalters@116
|
2 * \file
|
tomwalters@116
|
3 * \brief Frequency scale for generating filter banks and their frequencies
|
tomwalters@116
|
4 *
|
tomwalters@116
|
5 * \author Willem van Engen <cnbh@willem.engen.nl>
|
tomwalters@116
|
6 * \date created 2006/09/28
|
tomwalters@116
|
7 * \version \$Id: Scale.cpp 459 2007-11-08 11:50:04Z tom $
|
tomwalters@116
|
8 */
|
tomwalters@116
|
9 /* (c) 2006, University of Cambridge, Medical Research Council
|
tomwalters@116
|
10 * http://www.pdn.cam.ac.uk/groups/cnbh/aimmanual
|
tomwalters@116
|
11 */
|
tomwalters@227
|
12 #include "Support/common.h"
|
tomwalters@227
|
13 #include "Support/util.h"
|
tomwalters@227
|
14 #include "Modules/Scale/Scale.h"
|
tomwalters@227
|
15 #include "Modules/Scale/ScaleLinear.h"
|
tomwalters@227
|
16 #include "Modules/Scale/ScaleERB.h"
|
tomwalters@227
|
17 #include "Modules/Scale/ScaleLog.h"
|
tomwalters@227
|
18 #include "Modules/Scale/ScaleLogScaled.h"
|
tomwalters@116
|
19
|
tomwalters@227
|
20 Scale *Scale::Create(ScaleType iType, unsigned int min, unsigned int max, float density)
|
tomwalters@227
|
21 {
|
tomwalters@228
|
22 switch(iType) {
|
tomwalters@228
|
23 case SCALE_LINEAR:
|
tomwalters@228
|
24 return static_cast<Scale*>(new ScaleLinear(min, max, density));
|
tomwalters@228
|
25 case SCALE_ERB:
|
tomwalters@228
|
26 return static_cast<Scale*>(new ScaleERB(min, max, density));
|
tomwalters@228
|
27 case SCALE_LOG:
|
tomwalters@228
|
28 return static_cast<Scale*>(new ScaleLog(min, max, density));
|
tomwalters@228
|
29 case SCALE_LOGSCALED:
|
tomwalters@228
|
30 return static_cast<Scale*>(new ScaleLogScaled(min, max, density));
|
tomwalters@228
|
31 default:
|
tomwalters@228
|
32 aimASSERT(0);
|
tomwalters@228
|
33 break;
|
tomwalters@228
|
34 }
|
tomwalters@228
|
35 // Unreachable code
|
tomwalters@228
|
36 aimASSERT(0);
|
tomwalters@228
|
37 return NULL;
|
tomwalters@116
|
38 }
|
tomwalters@116
|
39
|
tomwalters@227
|
40 Scale *Scale::Create(ScaleType iType)
|
tomwalters@227
|
41 {
|
tomwalters@228
|
42 return Create(iType, 0, 0, 0);
|
tomwalters@116
|
43 }
|
tomwalters@116
|
44
|
tomwalters@227
|
45 Scale *Scale::Clone()
|
tomwalters@227
|
46 {
|
tomwalters@228
|
47 Scale *pScale = Create(m_iType, m_iMin, m_iMax, m_fDensity);
|
tomwalters@228
|
48 aimASSERT(pScale);
|
tomwalters@228
|
49 pScale->m_fScaledCurHalfSum = m_fScaledCurHalfSum;
|
tomwalters@228
|
50 pScale->m_fScaledCurDiff = m_fScaledCurDiff;
|
tomwalters@228
|
51 return pScale;
|
tomwalters@116
|
52 }
|
tomwalters@116
|
53
|
tomwalters@227
|
54 float Scale::FromLinearScaled(float fVal)
|
tomwalters@227
|
55 {
|
tomwalters@228
|
56 /*! This function returns
|
tomwalters@228
|
57 * ( FromLinear(fVal) - (fMinScaled+fMaxScaled)/2 ) / (fMaxScaled-fMinScaled)
|
tomwalters@228
|
58 */
|
tomwalters@228
|
59 float fValScaled = FromLinear(fVal);
|
tomwalters@228
|
60 return (fValScaled - m_fScaledCurHalfSum) / m_fScaledCurDiff;
|
tomwalters@227
|
61 }
|
tomwalters@227
|
62 void Scale::FromLinearScaledExtrema(float fMin, float fMax)
|
tomwalters@227
|
63 {
|
tomwalters@228
|
64 float fMinScaled = FromLinear(fMin);
|
tomwalters@228
|
65 float fMaxScaled = FromLinear(fMax);
|
tomwalters@228
|
66 m_fScaledCurHalfSum = (fMinScaled+fMaxScaled)/2;
|
tomwalters@228
|
67 m_fScaledCurDiff = fMaxScaled-fMinScaled;
|
tomwalters@228
|
68 m_fMin = fMin;
|
tomwalters@228
|
69 m_fMax = fMax;
|
tomwalters@227
|
70 }
|
tomwalters@227
|
71 void Scale::FromLinearScaledExtrema(Scale *pScale)
|
tomwalters@227
|
72 {
|
tomwalters@228
|
73 aimASSERT(pScale);
|
tomwalters@228
|
74 FromLinearScaledExtrema(pScale->m_fMin, pScale->m_fMax);
|
tomwalters@116
|
75 }
|
tom@118
|
76
|
tomwalters@227
|
77 SignalBank* Scale::CreateSignalBank(unsigned int iChannels, unsigned int iBufferlength, unsigned int iSamplerate)
|
tomwalters@227
|
78 {
|
tomwalters@228
|
79 SignalBank *pBank;
|
tomwalters@228
|
80 double intpart, fracpart;
|
tomwalters@228
|
81 fracpart = modf((m_iMax-m_iMin)*m_fDensity, &intpart);
|
tomwalters@228
|
82 unsigned int nBankChan = (unsigned int) intpart;
|
tomwalters@228
|
83 if (fracpart >= 0.5f)
|
tomwalters@227
|
84 nBankChan++;
|
tomwalters@227
|
85
|
tomwalters@228
|
86 pBank = new SignalBank(iChannels, iBufferlength, iSamplerate, nBankChan);
|
tomwalters@228
|
87 aimASSERT(pBank);
|
tomwalters@227
|
88
|
tomwalters@228
|
89 float scaleDelta = ( FromLinear(m_iMax) - FromLinear(m_iMin) ) / (nBankChan-1);
|
tomwalters@228
|
90 float scaleCur = FromLinear(m_iMin);
|
tomwalters@227
|
91
|
tomwalters@228
|
92 for (unsigned int i=0; i<nBankChan; i++) {
|
tomwalters@228
|
93 pBank->setCentreFrequency(i, ToLinear(scaleCur));
|
tomwalters@228
|
94 scaleCur+=scaleDelta;
|
tomwalters@228
|
95 }
|
tomwalters@227
|
96
|
tomwalters@228
|
97 return pBank;
|
tomwalters@116
|
98 }
|
tom@118
|
99
|
tomwalters@227
|
100
|
tomwalters@227
|
101
|
tomwalters@227
|
102 SignalBank* Scale::CreateSignalBank(Signal* pSig) {
|
tomwalters@228
|
103 aimASSERT(pSig);
|
tomwalters@228
|
104 return CreateSignalBank(pSig->getAudioChannels(), pSig->getBufferlength(), pSig->getSamplerate());
|
tomwalters@116
|
105 }
|
tomwalters@227
|
106
|