Browse Source

Starting to improve the new algorithm (took what's best in older algo).

master
Nasca Octavian PAUL 14 years ago
parent
commit
6ccce6eb4f
2 changed files with 37 additions and 4 deletions
  1. +33
    -3
      Stretch.cpp
  2. +4
    -1
      Stretch.h

+ 33
- 3
Stretch.cpp View File

@@ -152,16 +152,25 @@ Stretch::Stretch(REALTYPE rap_,int bufsize_,FFTWindow w,bool bypass_,REALTYPE sa


out_buf=new REALTYPE[bufsize]; out_buf=new REALTYPE[bufsize];
old_freq=new REALTYPE[bufsize]; old_freq=new REALTYPE[bufsize];

very_old_smps=new REALTYPE[bufsize];
new_smps=new REALTYPE[bufsize];
old_smps=new REALTYPE[bufsize]; old_smps=new REALTYPE[bufsize];

old_out_smps=new REALTYPE[bufsize*2]; old_out_smps=new REALTYPE[bufsize*2];
for (int i=0;i<bufsize*2;i++) old_out_smps[i]=0.0;
for (int i=0;i<bufsize*2;i++) {
old_out_smps[i]=0.0;
};
for (int i=0;i<bufsize;i++) { for (int i=0;i<bufsize;i++) {
old_freq[i]=0.0; old_freq[i]=0.0;
new_smps[i]=0.0;
old_smps[i]=0.0; old_smps[i]=0.0;
very_old_smps[i]=0.0;
}; };




infft=new FFT(bufsize*2); infft=new FFT(bufsize*2);
fft=new FFT(bufsize*2);
outfft=new FFT(bufsize*2); outfft=new FFT(bufsize*2);
remained_samples=0.0; remained_samples=0.0;
window_type=w; window_type=w;
@@ -172,8 +181,11 @@ Stretch::Stretch(REALTYPE rap_,int bufsize_,FFTWindow w,bool bypass_,REALTYPE sa
Stretch::~Stretch(){ Stretch::~Stretch(){
delete [] old_freq; delete [] old_freq;
delete [] out_buf; delete [] out_buf;
delete [] new_smps;
delete [] old_smps; delete [] old_smps;
delete [] very_old_smps;
delete [] old_out_smps; delete [] old_out_smps;
delete fft;
delete infft; delete infft;
delete outfft; delete outfft;
}; };
@@ -189,12 +201,19 @@ void Stretch::do_analyse_inbuf(REALTYPE *smps){
infft->smp[i+bufsize]=smps[i]; infft->smp[i+bufsize]=smps[i];


old_freq[i]=infft->freq[i]; old_freq[i]=infft->freq[i];
old_smps[i]=smps[i];
}; };
infft->applywindow(window_type); infft->applywindow(window_type);
infft->smp2freq(); infft->smp2freq();
}; };


void Stretch::do_next_inbuf_smps(REALTYPE *smps){
for (int i=0;i<bufsize;i++) {
very_old_smps[i]=old_smps[i];
old_smps[i]=new_smps[i];
new_smps[i]=smps[i];
};
};

void Stretch::process(REALTYPE *smps,int nsmps){ void Stretch::process(REALTYPE *smps,int nsmps){
if (bypass){ if (bypass){
for (int i=0;i<bufsize;i++) out_buf[i]=smps[i]; for (int i=0;i<bufsize;i++) out_buf[i]=smps[i];
@@ -212,11 +231,22 @@ void Stretch::process(REALTYPE *smps,int nsmps){
do_analyse_inbuf(smps); do_analyse_inbuf(smps);
if (nsmps==bufsize*2) do_analyse_inbuf(smps+bufsize); if (nsmps==bufsize*2) do_analyse_inbuf(smps+bufsize);
}; };


//compute the output spectrum //compute the output spectrum
#warning sa fac output spectrum ca la versiunea veche prin reanaliza a bufferului very_old_smps,old_smps,new_smps
for (int i=0;i<bufsize;i++) { for (int i=0;i<bufsize;i++) {
outfft->freq[i]=infft->freq[i]*remained_samples+old_freq[i]*(1.0-remained_samples); outfft->freq[i]=infft->freq[i]*remained_samples+old_freq[i]*(1.0-remained_samples);
}; };


//move the buffers
if (nsmps!=0){//new data arrived: update the frequency components
do_next_inbuf_smps(smps);
if (nsmps==bufsize*2) {
do_next_inbuf_smps(smps+bufsize);
};
};
process_spectrum(outfft->freq); process_spectrum(outfft->freq);


outfft->freq2smp(); outfft->freq2smp();


+ 4
- 1
Stretch.h View File

@@ -91,13 +91,16 @@ class Stretch{
private: private:


void do_analyse_inbuf(REALTYPE *smps); void do_analyse_inbuf(REALTYPE *smps);
void do_next_inbuf_smps(REALTYPE *smps);


// REALTYPE *in_pool;//de marimea in_bufsize // REALTYPE *in_pool;//de marimea in_bufsize
REALTYPE rap; REALTYPE rap;
REALTYPE *old_out_smps; REALTYPE *old_out_smps;
REALTYPE *old_freq,*old_smps;
REALTYPE *old_freq;
REALTYPE *new_smps,*old_smps,*very_old_smps;


FFT *infft,*outfft; FFT *infft,*outfft;
FFT *fft;
long double remained_samples;//0..1 long double remained_samples;//0..1
REALTYPE c_pos_percents; REALTYPE c_pos_percents;
bool require_new_buffer; bool require_new_buffer;


Loading…
Cancel
Save