From 33c9e684bbba401db59f57eb492f6f20794a35cd Mon Sep 17 00:00:00 2001 From: sleepwalking <2657202503@qq.com> Date: Tue, 15 Jul 2014 20:18:01 +0800 Subject: [PATCH] Ready to release. --- README.md | 4 ++-- src/Spectral/Pitch.c | 14 +++++++------- src/Spectral/_Pitch.h | 3 +++ src/Spectral/_Pitch.rc | 23 ++++++++++++++++++++++ test/TestSMS/main.c | 44 +++++++----------------------------------- 5 files changed, 42 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 62214df..c10a02b 100644 --- a/README.md +++ b/README.md @@ -31,11 +31,11 @@ Todo & Plan List - [ ] Implement `GainIterfector` in CVEDSP2(in: `Wave` `Wave`, out: `Wave`) - [ ] Implement `MixIterfector` in CVEDSP2(in: `Wave` `Wave`, out: `Wave`) - [ ] Implement `PulseItersizer` in CVEDSP2(in: `Position`, out: `Wave`) -- [ ] Implement `TurbIterfector`(in: `Wave` `Wave`, out: `Wave`) ####Step3: Voice Manipulation -- [ ] Timbre adjustment related to pitch scaling +- [x] Timbre adjustment related to pitch scaling +- [ ] Turbulent Noise regeneration in `HNMItersizer` - [ ] Implement `GenKlatt` based on `FWindow` - [ ] Implement `EpRParam` structure - [ ] Implement `EpRParam_ToHNMContour` diff --git a/src/Spectral/Pitch.c b/src/Spectral/Pitch.c index 27615c2..06ee549 100644 --- a/src/Spectral/Pitch.c +++ b/src/Spectral/Pitch.c @@ -43,17 +43,17 @@ void CSVP_PitchModel_SetDefault(First, int Gender) RCall(_PMatch, AddPair)(& This -> HmncCurve, 150.0, -1.0); RCall(_PMatch, AddPair)(& This -> HmncCurve, 0.0, -2.0); - RCall(_PMatch, AddPair)(& This -> NoizCurve, 700.0, -2.0); - RCall(_PMatch, AddPair)(& This -> NoizCurve, 300.0, +0.0); - RCall(_PMatch, AddPair)(& This -> NoizCurve, 200.0, +0.0); - RCall(_PMatch, AddPair)(& This -> NoizCurve, 150.0, -0.5); - RCall(_PMatch, AddPair)(& This -> NoizCurve, 0.0, -1.5); + RCall(_PMatch, AddPair)(& This -> NoizCurve, 700.0, -1.0); + RCall(_PMatch, AddPair)(& This -> NoizCurve, 300.0, +1.0); + RCall(_PMatch, AddPair)(& This -> NoizCurve, 200.0, +1.0); + RCall(_PMatch, AddPair)(& This -> NoizCurve, 150.0, +0.5); + RCall(_PMatch, AddPair)(& This -> NoizCurve, 0.0, -0.5); RCall(_PMatch, AddPair)(& This -> PhseCurve, 700.0, 1.7); RCall(_PMatch, AddPair)(& This -> PhseCurve, 360.0, 1.0); RCall(_PMatch, AddPair)(& This -> PhseCurve, 260.0, 1.0); - RCall(_PMatch, AddPair)(& This -> PhseCurve, 200.0, 0.6); - RCall(_PMatch, AddPair)(& This -> PhseCurve, 150.0, 0.3); + RCall(_PMatch, AddPair)(& This -> PhseCurve, 200.0, 0.5); + RCall(_PMatch, AddPair)(& This -> PhseCurve, 150.0, 0.2); RCall(_PMatch, AddPair)(& This -> PhseCurve, 0.0, 0.0); } diff --git a/src/Spectral/_Pitch.h b/src/Spectral/_Pitch.h index b1d7d76..9213b7d 100644 --- a/src/Spectral/_Pitch.h +++ b/src/Spectral/_Pitch.h @@ -7,6 +7,9 @@ RTFunc(void, CSVP_PitchShiftHNMContour, _HNMContour* Dest, RTFunc(void, CSVP_PitchAdjustHNMContour, _HNMContour* Dest, CSVP_PitchModel* Sorc, _T1 F0, int SampleRate); +RTFunc(void, CSVP_PitchConvertHNMFrame, _HNMContour* Dest, _HNMFrame* Sorc, + CSVP_PitchModel* Model, _T1 F0, int UFreq, int SampleRate); + #undef _HNMFrame #undef _HNMContour diff --git a/src/Spectral/_Pitch.rc b/src/Spectral/_Pitch.rc index 320a4f0..e01ddd2 100644 --- a/src/Spectral/_Pitch.rc +++ b/src/Spectral/_Pitch.rc @@ -30,6 +30,29 @@ RTFunc(void, CSVP_PitchAdjustHNMContour, _HNMContour* Dest, RCall(CDSP2_VCAdd, _T1)(Dest -> Noiz, Dest -> Noiz, NoizAmp, Size); } +RTFunc(void, CSVP_PitchConvertHNMFrame, _HNMContour* Dest, _HNMFrame* Sorc, + CSVP_PitchModel* Model, _T1 F0, int UFreq, int SampleRate) +{ + float Sum1, Sum2, Ratio; + + _HNMFrame TempHNM; + RCall(_HNMFrame, Ctor)(& TempHNM); + + RCall(_HNMFrame, ToContour)(Sorc, Dest); + CSVP_PitchShiftHNMContour_Float(Dest, Model, F0 - Sorc -> Hmnc.Freq[0], + SampleRate); + + Sum1 = CSVP_EnergyFromHNMFrame_Float(Sorc); + RCall(_HNMFrame, FromContour)(& TempHNM, Dest, F0, UFreq); + Sum2 = CSVP_EnergyFromHNMFrame_Float(& TempHNM); + Ratio = log((1.0 + sqrt(Sum1 / Sum2)) / 2.0); + + CSVP_PitchAdjustHNMContour_Float(Dest, Model, F0, SampleRate); + CDSP2_VCAdd_Float(Dest -> Hmnc, Dest -> Hmnc, Ratio, Dest -> Size / 2 + 1); + + RCall(_HNMFrame, Dtor)(& TempHNM); +} + #undef _HNMFrame #undef _HNMContour diff --git a/test/TestSMS/main.c b/test/TestSMS/main.c index 8334864..bbde034 100644 --- a/test/TestSMS/main.c +++ b/test/TestSMS/main.c @@ -38,7 +38,7 @@ int main() String Path; String_Ctor(& Path); - String_SetChars(& Path, "/tmp/duan.wav"); + String_SetChars(& Path, "/tmp/yao.wav"); RCall(Wave, FromFile)(& XWave, & Path); RCall(Wave, Resize)(& YWave, XWave.Size * Stretch + 5000); @@ -93,19 +93,9 @@ int main() { HNMFrame* OrigHNM = & HNMIter.HNMList.Frames[i]; - RCall(HNMFrame, ToContour)(OrigHNM, & TempCont); - float Sum1, Sum2, Ratio; - float F0 = OrigHNM -> Hmnc.Freq[0] * 2; - Sum1 = CSVP_EnergyFromHNMFrame_Float(OrigHNM); - CSVP_PitchShiftHNMContour_Float(& TempCont, & PM, - F0 - OrigHNM -> Hmnc.Freq[0], XWave.SampleRate); + float F0 = OrigHNM -> Hmnc.Freq[0] * 1.5; - RCall(HNMFrame, FromContour)(& TempHNM, & TempCont, F0, 12000); - Sum2 = CSVP_EnergyFromHNMFrame_Float(& TempHNM); - Ratio = sqrt(Sum1 / Sum2); - - RCall(CDSP2_VCAdd, Float)(TempCont.Noiz, TempCont.Noiz, 1.0, 1025); - CSVP_PitchAdjustHNMContour_Float(& TempCont, & PM, F0, + CSVP_PitchConvertHNMFrame_Float(& TempCont, OrigHNM, & PM, F0, 12000, XWave.SampleRate); RCall(HNMFrame, From)(& TempHNM, OrigHNM); RCall(HNMFrame, FromContour)(& TempHNM, & TempCont, F0, 12000); @@ -127,8 +117,6 @@ int main() printf("%f\n", TempCont.Hmnc[j]); exit(0); }*/ - for(j = 0; j < TempHNM.Hmnc.Size; j ++) - TempHNM.Hmnc.Ampl[j] *= (1.0 + Ratio) / 2; for(j = 0; j < Stretch; j ++) { @@ -138,13 +126,7 @@ int main() } Last = HNMSizer.PulseList.Frames[i * Stretch - 1]; RDelete(& TempCont, & TempHNM, & PM); - - //int f = i / 2; - - //for(j = 0; j < HNMIter.PhseList.Frames[f].Size; j ++) - // HNMIter.PhseList.Frames[f].Data[j] = 2.0 * M_PI; -// + (float)rand() / RAND_MAX * (float) j; - + RCall(HNMItersizer, SetHopSize)(& HNMSizer, FFTSIZE); RCall(HNMItersizer, SetWave)(& HNMSizer, & YWave); @@ -155,10 +137,7 @@ int main() printf("%f\n", HNMSizer.SubsizerS -> PhseMatch.PulseList.X[5]); HNMSizer.Option.PhaseControl = 1; - - - //printf("%d %d\n", Last - 1000, HNMIter.PulseList.Frames[f]); - + RCall(HNMItersizer, PrevTo )(& HNMSizer, 0); RCall(HNMItersizer, IterNextTo)(& HNMSizer, Last - 8000); RCall(HNMItersizer, IterNextTo)(& HNMSizer, Last - 1000); @@ -166,19 +145,10 @@ int main() String_SetChars(& Path, "/tmp/out.wav"); RCall(Wave, ToFile)(& YWave, & Path); - - HNMContour TestCont; - HNMFrame TestFrame; - RCall(HNMFrame, Ctor)(& TestFrame); - RCall(HNMContour, Ctor)(& TestCont); - RCall(HNMFrame, ToContour)(& HNMIter.HNMList.Frames[i / 2], & TestCont); - RCall(HNMFrame, FromContour)(& TestFrame, & TestCont, 200, 8000); - //for(i = 0; i < TestFrame.Hmnc.Size; i ++) - // printf("%f, %f\n", TestFrame.Hmnc.Freq[i], TestFrame.Hmnc.Ampl[i]); - + RFree(Win); - RDelete(& Path, & TestCont, & TestFrame); + RDelete(& Path); RDelete(& XWave, & YWave, & HNMIter, & HNMSizer, & F0Iter); return 0; }