CLAM-Development  1.4.0
SMSAnalysisCore.cxx
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2001-2004 MUSIC TECHNOLOGY GROUP (MTG)
3  * UNIVERSITAT POMPEU FABRA
4  *
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  *
20  */
21 
22 #include "Frame.hxx"
23 #include "Segment.hxx"
24 #include "Fundamental.hxx"
25 #include "SpectrumConfig.hxx"
26 #include "SMSAnalysisCore.hxx"
27 #include "ProcessingFactory.hxx"
28 
29 namespace CLAM
30 {
31 namespace Hidden
32 {
33  static const char * metadata[] = {
34  "key", "SMSAnalysisCore",
35  "category", "Analysis",
36  "description", "SMSAnalysisCore",
37  0
38  };
39  static FactoryRegistrator<ProcessingFactory, SMSAnalysisCore> reg = metadata;
40 }
41 
42 
44  : mInputAudio("Input Audio",this ),
45  mOutputResSpectrum("Residual Branch Spectrum",this ),
46  mOutputSinSpectrum("Sinusoidal Branch Spectrum",this ),
47  mOutputSpectralPeaks("Sinusoidal Peaks",this ),
48  mOutputFundamental("Fundamental",this ),
49  mOutputSubstractedSpectrum("Residual Spectrum", this )
50 {
51  AttachChildren();
52  ConnectAndPublishPorts();
54 }
55 
57  : mInputAudio("Input Audio",this ),
58  mOutputResSpectrum("Residual Branch Spectrum",this ),
59  mOutputSinSpectrum("Sinusoidal Branch Spectrum",this ),
60  mOutputSpectralPeaks("Sinusoidal Peaks",this ),
61  mOutputFundamental("Fundamental",this ),
62  mOutputSubstractedSpectrum("Residual Spectrum", this )
63 {
64  AttachChildren();
65  ConnectAndPublishPorts();
66  Configure(cfg);
67 }
68 
69 
70 
72 {
73 }
74 
75 bool SMSAnalysisCore::ConcreteConfigure(const ProcessingConfig& cfg)
76 {
77  CopyAsConcreteConfig(mConfig,cfg);
78  ConfigureChildren();
79  ConfigureData();
80  return true;
81 }
82 
83 
84 bool SMSAnalysisCore::ConfigureChildren()
85 {
86  mSinSpectralAnalysis.Configure(mConfig.GetSinSpectralAnalysis());
87  mResSpectralAnalysis.Configure(mConfig.GetResSpectralAnalysis());
88  mPeakDetect.Configure(mConfig.GetPeakDetect());
89  mFundDetect.Configure(mConfig.GetFundFreqDetect());
90  mSinTracking.Configure(mConfig.GetSinTracking());
91  mSynthSineSpectrum.Configure(mConfig.GetSynthSineSpectrum());
92 
93  /*Initializing and configuring member circular buffers*/
94 
95  TSize frameSize=mConfig.GetHopSize();
96  TSize sinWindowSize=mConfig.GetSinWindowSize();
97  TSize resWindowSize=mConfig.GetResWindowSize();
98 
99  mSinSpectralAnalysis.GetInPort("Input").SetSize( sinWindowSize - 1 );
100  mSinSpectralAnalysis.GetInPort("Input").SetHop( frameSize );
101  mResSpectralAnalysis.GetInPort("Input").SetSize( resWindowSize - 1 );
102  mResSpectralAnalysis.GetInPort("Input").SetHop( frameSize );
103 
104  return true;
105 
106 }
107 
108 void SMSAnalysisCore::ConfigureData()
109 {
110  // XR: TODO - Get Sampling Rate from input audio?
111  //Unused variable: TData samplingRate=mConfig.GetSamplingRate();
112 
113  Spectrum resSpec;
114  Spectrum sinSpec;
115 
116  // Spectrum used for temporary residual analysis
117  SpectrumConfig scfg;
118  scfg.SetSize(mConfig.GetResSpectralAnalysis().GetFFT().GetAudioSize()/2+1); // s.AudioFrameSize is the size of the generated frames
119  scfg.SetSpectralRange(mConfig.GetSamplingRate()*0.5);
120  resSpec.Configure(scfg);
121 
122 
123  // Spectrum used for temporary sinusoidal analysis
124  scfg.SetSize(mConfig.GetSinSpectralAnalysis().GetFFT().GetAudioSize()/2+1);
125  sinSpec.Configure(scfg);
126 
127  /* Now we set prototype of SpectrumSubstracter: we want to substract two spectrums:
128  the first on in MagPhase format, the second in Complex format and get the result back
129  in Mag Phase.*/
130 
131  SpectrumConfig Scfg;
132  SpecTypeFlags sflags;
133  sflags.bComplex = 1;
134  sflags.bPolar = 0;
135  sflags.bMagPhase = 0;
136  sflags.bMagPhaseBPF = 0;
137  Scfg.SetType(sflags);
138  Scfg.SetSize(resSpec.GetSize());
139  Scfg.SetSpectralRange(mConfig.GetSamplingRate()*0.5);
140  Spectrum tmpSpecIn(Scfg);
141 
142  mSpecSubstracter.SetPrototypes(resSpec,tmpSpecIn,resSpec);
143 }
144 
145 void SMSAnalysisCore::AttachChildren()
146 {
147  mSinSpectralAnalysis.SetParent(this);
148  mResSpectralAnalysis.SetParent(this);
149  mPeakDetect.SetParent(this);
150  mFundDetect.SetParent(this);
151  mSinTracking.SetParent(this);
152  mSynthSineSpectrum.SetParent( this );
153  mSpecSubstracter.SetParent(this);
154 }
155 
157 {
158  CLAM_ASSERT( mSinSpectralAnalysis.GetInPort("Input").GetVisuallyConnectedOutPort(),
159  "SMSAnalysisCore::ConcreteStart in port 'Input' needs an attached out port, to start");
160 
161  // TODO: port sizes negitiation should be managed by the flow control
162  if (mSinSpectralAnalysis.GetInPort("Input").GetVisuallyConnectedOutPort()->GetSize()%2!=0)
163  {
164 
165  int sinSize = mSinSpectralAnalysis.GetInPort("Input").GetSize();
166  mSinSpectralAnalysis.GetInPort("Input").GetVisuallyConnectedOutPort()->SetSize( sinSize );
167  std::cout << "SMSAnalysisCore::ConcreteStart() Alert!! setting size mSinSpec... : "<< sinSize <<"\n";
168 
169  mSinSpectralAnalysis.GetInPort("Input").GetVisuallyConnectedOutPort()->SetHop( sinSize );
170 
171 // mInputAudio.GetVisuallyConnectedOutPort()->SetSize( mInputAudio.GetSize() );
172 // mInputAudio.GetVisuallyConnectedOutPort()->SetHop( mInputAudio.GetSize() );
173  }
174 
175 // mSinSpectralAnalysis.GetInPort("Input").GetVisuallyConnectedOutPort()->CenterEvenRegions();
177 
179 }
180 
182 {
183  if( mSinSpectralAnalysis.CanConsumeAndProduce() && mResSpectralAnalysis.CanConsumeAndProduce() )
184  {
185  mSinSpectralAnalysis.Do();
186  mResSpectralAnalysis.Do();
187 
188  CLAM_DEBUG_ASSERT( mPeakDetect.CanConsumeAndProduce(),
189  "SMSAnalysisCore::Do() mPeakDetect should have data feeded");
190  mPeakDetect.Do();
191 
192  CLAM_DEBUG_ASSERT( mFundDetect.CanConsumeAndProduce(),
193  "SMSAnalysisCore::Do() mFundDetect should have data feeded");
194  mFundDetect.Do();
195 
196  CLAM_DEBUG_ASSERT( mSinTracking.CanConsumeAndProduce(),
197  "SMSAnalysisCore::Do() mSinTracking should have data feeded");
198  mSinTracking.Do();
199 
200  CLAM_DEBUG_ASSERT( mSynthSineSpectrum.CanConsumeAndProduce(),
201  "SMSAnalysisCore::Do() mSynthSineSpectrum should have data feeded");
202  mSynthSineSpectrum.Do();
203 
204  CLAM_DEBUG_ASSERT( mSpecSubstracter.CanConsumeAndProduce(),
205  "SMSAnalysisCore::Do() specSubstracter should have data feeded");
206  mSpecSubstracter.Do();
207 
208  return true;
209  }
210 
211  return false;
212 }
213 
214 void SMSAnalysisCore::ConnectAndPublishPorts()
215 {
216  mInputAudio.PublishInPort( mSinSpectralAnalysis.GetInPort("Input"));
217  mInputAudio.PublishInPort( mResSpectralAnalysis.GetInPort("Input"));
218 
219  mSinSpectralAnalysis.GetOutPort("Output").ConnectToIn( mPeakDetect.GetInPort("Input spectrum"));
220  mPeakDetect.GetOutPort( "Output spectral peak array" ).ConnectToIn( mFundDetect.GetInPort("Input"));
221  mPeakDetect.GetOutPort( "Output spectral peak array" ).ConnectToIn( mSinTracking.GetInPort( "Input" ));
222  mFundDetect.GetOutControl( "Fund Freq Value").AddLink( mSinTracking.GetInControl( "Fund Freq Value" ));
223  mSinTracking.GetOutPort( "Output").ConnectToIn( mSynthSineSpectrum.GetInPort( "Input" ));
224 
225  mResSpectralAnalysis.GetOutPort("Output").ConnectToIn( mSpecSubstracter.GetInPort( "Input 1"));
226  mSynthSineSpectrum.GetOutPort("Output").ConnectToIn( mSpecSubstracter.GetInPort( "Input 2"));
227 
228  mOutputResSpectrum.PublishOutPort( mResSpectralAnalysis.GetOutPort("Output") );
229  mOutputSinSpectrum.PublishOutPort( mSinSpectralAnalysis.GetOutPort("Output") );
230  mOutputSpectralPeaks.PublishOutPort( mSinTracking.GetOutPort( "Output") );
231  mOutputFundamental.PublishOutPort( mFundDetect.GetOutPort( "Output" ) );
232  mOutputSubstractedSpectrum.PublishOutPort( mSpecSubstracter.GetOutPort( "Output") );
233 }
234 
235 } // namespace CLAM
236 
237