Spaces:
Sleeping
Sleeping
| /* | |
| Copyright 2015 Google Inc. All rights reserved. | |
| Licensed under the Apache License, Version 2.0 (the "License"); | |
| you may not use this file except in compliance with the License. | |
| You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| */ | |
| // LpcAnalyzer | |
| // A collection of methods commonly used in linear-prediction analysis. | |
| // Largest order allowed for any linear predictor analysis | |
| class LpcAnalyzer { | |
| public: | |
| LpcAnalyzer(void) { } | |
| ~LpcAnalyzer(void) { } | |
| // Apply Hanning weighting to the input data sequence in data_in, | |
| // put the results in data_out. Array lengths are assumed as | |
| // data_in has windowsize+1 points; data_out has windowsize | |
| // elements. | |
| void HannWindow(const float* data_in, float* data_out, int windowsize, | |
| float preemp); | |
| // Compute the order+1 autocorrelation lags of the windowsize | |
| // samples in data_in. Return the normalized autocorrelation | |
| // coefficients in autoc. The rms is returned in rms. | |
| void Autoc(int windowsize, float* data_in, int order, float* autoc, | |
| float* rms); | |
| // Using Durbin's recursion, convert the autocorrelation sequence in autocor | |
| // to reflection coefficients in refcof and predictor coefficients in lpc. | |
| // The prediction error energy (gain) is left in *gain. | |
| // Note: Durbin returns the coefficients in normal sign format. | |
| // (i.e. lpca[0] is assumed to be = +1.) | |
| void Durbin(float* autocor, float* refcof, float* lpc, int order, | |
| float* gain); | |
| // Compute the autocorrelations of the order LP coefficients in lpc. | |
| // (lpc[0] is assumed to be = 1 and not explicitely accessed.) | |
| // The magnitude of lpc is returned in mag. | |
| // 2* the other autocorrelation coefficients are returned in lpc_auto. | |
| void PcToAutocorPc(float* lpc, float* lpc_auto, float* mag, int order); | |
| // Compute the Itakura LPC distance between the model represented | |
| // by the signal autocorrelation (autoc) and its residual (gain) and | |
| // the model represented by an LPC autocorrelation (mag, lpc_auto). | |
| // Both models are of order. | |
| // r is assumed normalized and r[0]=1 is not explicitely accessed. | |
| // Values returned by the function are >= 1. | |
| float ItakuraDistance(int order, float* lpc_auto, float* mag, float* autoc, | |
| float gain); | |
| // Compute the time-weighted RMS of a size segment of data. The data | |
| // is weighted by a window of type w_type before RMS computation. w_type | |
| // is decoded above in window(). | |
| float WindowedRms(float* data, int size); | |
| // Generic autocorrelation LPC analysis of the floating-point | |
| // sequence in data. | |
| // | |
| // int lpc_ord, /* Analysis order | |
| // wsize; /* window size in points | |
| // float noise_floor, /* To simulate a white noise floor (dB SNR). | |
| // *lpca, /* if non-NULL, return vector for predictors | |
| // *ar, /* if non-NULL, return vector for normalized autoc. | |
| // *lpck, /* if non-NULL, return vector for PARCOR's | |
| // *normerr, /* return scalar for normalized error | |
| // *rms, /* return scalar for energy in preemphasized window | |
| // preemp; | |
| // float *data; /* input data sequence; assumed to be wsize+1 long | |
| int ComputeLpc(int lpc_ord, float noise_floor, int wsize, const float* data, | |
| float* lpca, float* ar, float* lpck, float* normerr, float* rms, | |
| float preemp); | |
| // Use the standard speech analysis formula to determine the | |
| // appropriate LPC order, given a sample rate. | |
| static int GetLpcOrder(float sample_rate) { | |
| return static_cast<int>(2.5 + (sample_rate / 1000.0)); | |
| } | |
| private: | |
| // Puts a time-weighting window of length n in energywind. | |
| void GetWindow(int n); | |
| std::vector<float> energywind_; | |
| std::vector<float> window_; | |
| }; | |