//---------------------------------------------------------------------------
#include <limits.h>
#include <stdio.h>
#include <vector>
#include <math.h>
#include "wave.hpp"
//---------------------------------------------------------------------------
using namespace std;
#define DPI (2*M_PI)
vector<double> Re;// [出力] 実数部
vector<double> Im;// [出力] 虚数部
void dft(MONO_PCM& pcm,double st, double ed)
{
// dft
double N = ed-st;
int NN = N;
int* a = &pcm.s[(int)st];
int ptr1=0;
int ptr2=0;
Re.clear();
Im.clear();
for( int fq=0; fq<NN; fq++ )
{
double Re_sum = 0;
double Im_sum = 0;
for( int i=0; i<NN; ++i){
double tht = DPI*fq*i/N;
Re_sum += a[i] * cos( tht );
Im_sum += a[i] * -sin( tht );
}
Re.push_back( Re_sum );
Im.push_back( Im_sum );
}
return;
}
void idft(MONO_PCM& pcm,double N,FILE* ws)
{
int NN = N;
int maxsamp=20;
vector<int> rank;
for( int fq=0; fq<NN; fq++ ){
rank.push_back(fq);
}
for( int i = 0 ; i < NN-1 ; i++ ){
for( int j = i+1; j < NN ; j++ ){
if( Im[rank[i]]*Im[rank[i]] < Im[rank[j]]*Im[rank[j]] ){
int temp = rank[i];
rank[i] = rank[j];
rank[j] = temp;
}
}
}
for( int i=0; i<5; i++ ){
printf("%lf ",Im[rank[i]]);
}
printf( "\n");
//周波数でソート
for( int i = 0 ; i < maxsamp-1 ; i++ ){
for( int j = i+1; j < maxsamp ; j++ ){
if( rank[i] > rank[j] ){
int temp = rank[i];
rank[i] = rank[j];
rank[j] = temp;
}
}
}
for( int i=0; i<maxsamp; i++ ){
double ffq = rank[i];
fprintf(ws,"%s%lf",((i==0)?"":","),ffq*44100/N);
}
for( int i = 0 ; i <maxsamp ; i++ ){
int ii = rank[i];
fprintf(ws,"%s%lf",((i==0)?",":","),Im[ii]);
}
fprintf(ws,",%lf\n",N);
for( int fq=0; fq<NN; fq++ )
{
double Re_sum = 0;
double Im_sum = 0;
for( int i = 0 ; i <maxsamp ; i++ ){
int ii = rank[i];
double tht = DPI*fq*ii*44100/N/44100;
//Re_sum += Im[ii]*sin(tht);
Re_sum += //Re[ii] * cos(tht)
-Im[ii] * sin(tht);
}
pcm.s.push_back(Re_sum/N);
}
return;
}
double f(MONO_PCM& pcm, double st,double ed)
{
// dft
double N = ed-st;
int NN = N;
int ist = st;
int ied = ed;
int* a = &pcm.s[0];
//Re.clear();
//Im.clear();
double Im_sum_all=0;
for( int fq=0; fq<NN; fq++ )
{
double Re_sum = 0;
double Im_sum = 0;
for( int i=0; i<NN; i++){
double tht = DPI*fq*i/N;
Re_sum += a[i+ist] * cos( tht );
//Im_sum += a[i+ist] * -sin( tht );
}
Im_sum_all += sqrt(Re_sum/N*Re_sum/N);
}
return Im_sum_all;
}
int main(int argc, char* argv[])
{
MONO_PCM pcm1;
MONO_PCM pcm3;
pcm1.read("hi.wav");
int ptr=0;
const int div=128;
int* dat = &pcm1.s[0];
FILE* ws = fopen("wav.csv","w");
//波形最大最小の取得
int min=0;
int max=0;
for( int i = 0 ; i < pcm1.s.size() ; i++ ){
int num = pcm1.s[i];
if( max<num) max = num;
if( min>num) min = num;
}
//最大値の5%を開始と認識
int minmaxlvl = (max-min)*0.1;
int buffer[1024]={0};
int bufptr=0;
int son=0;
int soff=0;
double adf=0;
printf( "%d %d\n", min, max);
//無音範囲検知
for( int i = 0 ; i < pcm1.s.size() ; i++ ){
buffer[bufptr++%1024] = dat[i];
min = 0;
max = 0;
for( int j = 0 ; j < 1024 ; j++ ){
if( min>buffer[j]) min = buffer[j];
if( max<buffer[j]) max = buffer[j];
}
//無音検知
if( son == 0 && max-min > minmaxlvl){
while(1){
if( dat[i]<=0 && dat[i+1]>=0) break;
i++;
}
son = i;
}
//終了無音検知
if( son && max-min < minmaxlvl ){
while(1){
if( dat[i-1]<=0 && dat[i]>=0) break;
i++;
}
soff = i;
break;
}
}
printf( "st:%d ed:%d all:%d\n",son,soff,pcm1.s.size());
//開始から終了まで
int cnt = 0;
for( int i = son ; i <=soff ; ){
//1波形抽出
double maxdiff =-10000;
double diff;
int maxptr;
for( int j = 80 ; j < 255 ; j++ ){
diff=0;
for( int k = 0 ; k < j ; k++ ){
diff += dat[i+k]*dat[i+j+k]/j/j;
}
if( diff>maxdiff ){
maxdiff = diff;
maxptr = i+j;
}
}
//終点前後でcos成分が最小となる点を探す
int maxptr1=maxptr;;
for( int k = 0 ; k < 10 ; k++ ){
double base = f(pcm1,i,maxptr1);
if( f(pcm1,i,maxptr-k)<base ){
maxptr1=maxptr-k;
}else if ( f(pcm1,i,maxptr+k)<base ){
maxptr1=maxptr+k;
}
}
maxptr = maxptr1;
int minptr=maxptr;
printf( "ORG:%d-",minptr-i);
double st = i;
double ed = minptr;
dft(pcm1,st,ed);
idft(pcm3,ed-st,ws);
i = ed;
cnt++;
}
fclose( ws );
pcm3.write("hi2.wav");
return 0;
}
//---------------------------------------------------------------------------
Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgIndhdmUuaHBwIgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBEUEkgKDIqTV9QSSkKCnZlY3Rvcjxkb3VibGU+IFJlOy8vIFvlh7rliptdIOWun+aVsOmDqAp2ZWN0b3I8ZG91YmxlPiBJbTsvLyBb5Ye65YqbXSDomZrmlbDpg6gKdm9pZCBkZnQoTU9OT19QQ00mIHBjbSxkb3VibGUgc3QsIGRvdWJsZSBlZCkKewogICAgLy8gZGZ0CiAgICBkb3VibGUgTiA9IGVkLXN0OwogICAgaW50IE5OID0gTjsKICAgIGludCogYSA9ICZwY20uc1soaW50KXN0XTsKICAgIGludCBwdHIxPTA7CiAgICBpbnQgcHRyMj0wOwogICAgUmUuY2xlYXIoKTsKICAgIEltLmNsZWFyKCk7CiAgICBmb3IoIGludCBmcT0wOyBmcTxOTjsgZnErKyApCiAgICB7CiAgICAgICAgZG91YmxlIFJlX3N1bSA9IDA7CiAgICAgICAgZG91YmxlIEltX3N1bSA9IDA7CiAgICAgICAgZm9yKCBpbnQgaT0wOyBpPE5OOyArK2kpewogICAgICAgICAgICBkb3VibGUgdGh0ID0gRFBJKmZxKmkvTjsKICAgICAgICAgICAgUmVfc3VtICs9IGFbaV0gKiAgY29zKCB0aHQgKTsKICAgICAgICAgICAgSW1fc3VtICs9IGFbaV0gKiAtc2luKCB0aHQgKTsKICAgICAgICB9CiAgICAgICAgUmUucHVzaF9iYWNrKCBSZV9zdW0gKTsKICAgICAgICBJbS5wdXNoX2JhY2soIEltX3N1bSApOwogICAgfQogICAgcmV0dXJuOwp9CnZvaWQgaWRmdChNT05PX1BDTSYgcGNtLGRvdWJsZSBOLEZJTEUqIHdzKQp7CiAgICBpbnQgTk4gPSBOOwogICAgaW50IG1heHNhbXA9MjA7CiAgICB2ZWN0b3I8aW50PiByYW5rOwogICAgZm9yKCBpbnQgZnE9MDsgZnE8Tk47IGZxKysgKXsKICAgICAgICByYW5rLnB1c2hfYmFjayhmcSk7CiAgICB9CiAgICBmb3IoIGludCBpID0gMCA7IGkgPCBOTi0xIDsgaSsrICl7CiAgICAgICAgZm9yKCBpbnQgaiA9IGkrMTsgaiA8IE5OIDsgaisrICl7CiAgICAgICAgICAgIGlmKCAgSW1bcmFua1tpXV0qSW1bcmFua1tpXV0gPCBJbVtyYW5rW2pdXSpJbVtyYW5rW2pdXSApewogICAgICAgICAgICAgICAgaW50IHRlbXAgPSByYW5rW2ldOwogICAgICAgICAgICAgICAgcmFua1tpXSA9IHJhbmtbal07CiAgICAgICAgICAgICAgICByYW5rW2pdID0gdGVtcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZvciggaW50IGk9MDsgaTw1OyBpKysgKXsKICAgICAgICBwcmludGYoIiVsZiAiLEltW3JhbmtbaV1dKTsKICAgIH0KICAgIHByaW50ZiggIlxuIik7CiAgICAvL+WRqOazouaVsOOBp+OCveODvOODiAogICAgZm9yKCBpbnQgaSA9IDAgOyBpIDwgbWF4c2FtcC0xIDsgaSsrICl7CiAgICAgICAgZm9yKCBpbnQgaiA9IGkrMTsgaiA8IG1heHNhbXAgOyBqKysgKXsKICAgICAgICAgICAgaWYoICByYW5rW2ldID4gcmFua1tqXSApewogICAgICAgICAgICAgICAgaW50IHRlbXAgPSByYW5rW2ldOwogICAgICAgICAgICAgICAgcmFua1tpXSA9IHJhbmtbal07CiAgICAgICAgICAgICAgICByYW5rW2pdID0gdGVtcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZvciggaW50IGk9MDsgaTxtYXhzYW1wOyBpKysgKXsKICAgICAgICBkb3VibGUgZmZxID0gcmFua1tpXTsKICAgICAgICBmcHJpbnRmKHdzLCIlcyVsZiIsKChpPT0wKT8iIjoiLCIpLGZmcSo0NDEwMC9OKTsKICAgIH0KICAgIGZvciggaW50IGkgPSAwIDsgaSA8bWF4c2FtcCA7IGkrKyApewogICAgICAgIGludCBpaSA9IHJhbmtbaV07CiAgICAgICAgZnByaW50Zih3cywiJXMlbGYiLCgoaT09MCk/IiwiOiIsIiksSW1baWldKTsKICAgIH0KICAgIGZwcmludGYod3MsIiwlbGZcbiIsTik7CgogICAgZm9yKCBpbnQgZnE9MDsgZnE8Tk47IGZxKysgKQogICAgewogICAgICAgIGRvdWJsZSBSZV9zdW0gPSAwOwogICAgICAgIGRvdWJsZSBJbV9zdW0gPSAwOwogICAgICAgIGZvciggaW50IGkgPSAwIDsgaSA8bWF4c2FtcCA7IGkrKyApewogICAgICAgICAgIGludCBpaSA9IHJhbmtbaV07CiAgICAgICAgICAgZG91YmxlIHRodCA9IERQSSpmcSppaSo0NDEwMC9OLzQ0MTAwOwogICAgICAgICAgIC8vUmVfc3VtICs9IEltW2lpXSpzaW4odGh0KTsKICAgICAgICAgICBSZV9zdW0gKz0gICAvL1JlW2lpXSAqIGNvcyh0aHQpCiAgICAgICAgICAgICAgICAgICAgICAtSW1baWldICogc2luKHRodCk7CiAgICAgICAgfQogICAgICAgIHBjbS5zLnB1c2hfYmFjayhSZV9zdW0vTik7CiAgICB9CiAgICByZXR1cm47Cn0KZG91YmxlIGYoTU9OT19QQ00mIHBjbSwgZG91YmxlIHN0LGRvdWJsZSBlZCkKewogICAgLy8gZGZ0CiAgICBkb3VibGUgTiA9IGVkLXN0OwogICAgaW50IE5OID0gTjsKICAgIGludCBpc3QgPSBzdDsKICAgIGludCBpZWQgPSBlZDsKICAgIGludCogYSA9ICZwY20uc1swXTsKICAgIC8vUmUuY2xlYXIoKTsKICAgIC8vSW0uY2xlYXIoKTsKICAgIGRvdWJsZSBJbV9zdW1fYWxsPTA7CiAgICBmb3IoIGludCBmcT0wOyBmcTxOTjsgZnErKyApCiAgICB7CiAgICAgICAgZG91YmxlIFJlX3N1bSA9IDA7CiAgICAgICAgZG91YmxlIEltX3N1bSA9IDA7CiAgICAgICAgZm9yKCBpbnQgaT0wOyBpPE5OOyBpKyspewogICAgICAgICAgICBkb3VibGUgdGh0ID0gRFBJKmZxKmkvTjsKICAgICAgICAgICAgUmVfc3VtICs9IGFbaStpc3RdICogIGNvcyggdGh0ICk7CiAgICAgICAgICAgIC8vSW1fc3VtICs9IGFbaStpc3RdICogLXNpbiggdGh0ICk7CiAgICAgICAgfQogICAgICAgIEltX3N1bV9hbGwgKz0gc3FydChSZV9zdW0vTipSZV9zdW0vTik7CiAgICB9CiAgICByZXR1cm4gSW1fc3VtX2FsbDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewogICAgICBNT05PX1BDTSBwY20xOwogICAgICBNT05PX1BDTSBwY20zOwoKICAgICAgcGNtMS5yZWFkKCJoaS53YXYiKTsKICAgICAgaW50IHB0cj0wOwogICAgICBjb25zdCBpbnQgZGl2PTEyODsKICAgICAgaW50KiBkYXQgPSAmcGNtMS5zWzBdOwogICAgICBGSUxFKiB3cyA9IGZvcGVuKCJ3YXYuY3N2IiwidyIpOwoKICAgICAgLy/ms6LlvaLmnIDlpKfmnIDlsI/jga7lj5blvpcKICAgICAgaW50IG1pbj0wOwogICAgICBpbnQgbWF4PTA7CiAgICAgIGZvciggaW50IGkgPSAwIDsgaSA8IHBjbTEucy5zaXplKCkgOyBpKysgKXsKICAgICAgICBpbnQgbnVtID0gcGNtMS5zW2ldOwogICAgICAgIGlmKCBtYXg8bnVtKSBtYXggPSBudW07CiAgICAgICAgaWYoIG1pbj5udW0pIG1pbiA9IG51bTsKICAgICAgfQogICAgICAvL+acgOWkp+WApOOBrjUl44KS6ZaL5aeL44Go6KqN6K2YCiAgICAgIGludCBtaW5tYXhsdmwgPSAobWF4LW1pbikqMC4xOwogICAgICBpbnQgYnVmZmVyWzEwMjRdPXswfTsKICAgICAgaW50IGJ1ZnB0cj0wOwogICAgICBpbnQgc29uPTA7CiAgICAgIGludCBzb2ZmPTA7CiAgICAgIGRvdWJsZSBhZGY9MDsKCiAgICAgIHByaW50ZiggIiVkICVkXG4iLCBtaW4sIG1heCk7CiAgICAgIC8v54Sh6Z+z56+E5Zuy5qSc55+lCiAgICAgIGZvciggaW50IGkgPSAwIDsgaSA8IHBjbTEucy5zaXplKCkgOyBpKysgKXsKICAgICAgICBidWZmZXJbYnVmcHRyKyslMTAyNF0gPSBkYXRbaV07CiAgICAgICAgbWluID0gMDsKICAgICAgICBtYXggPSAwOwogICAgICAgIGZvciggaW50IGogPSAwIDsgaiA8IDEwMjQgOyBqKysgKXsKICAgICAgICAgICAgaWYoIG1pbj5idWZmZXJbal0pIG1pbiA9IGJ1ZmZlcltqXTsKICAgICAgICAgICAgaWYoIG1heDxidWZmZXJbal0pIG1heCA9IGJ1ZmZlcltqXTsKICAgICAgICB9CiAgICAgICAgLy/nhKHpn7PmpJznn6UKICAgICAgICBpZiggc29uID09IDAgJiYgbWF4LW1pbiA+IG1pbm1heGx2bCl7CiAgICAgICAgICAgIHdoaWxlKDEpewogICAgICAgICAgICAgICAgaWYoIGRhdFtpXTw9MCAmJiBkYXRbaSsxXT49MCkgYnJlYWs7CiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc29uID0gaTsKICAgICAgICB9CiAgICAgICAgLy/ntYLkuobnhKHpn7PmpJznn6UKICAgICAgICBpZiggc29uICYmIG1heC1taW4gPCBtaW5tYXhsdmwgKXsKICAgICAgICAgICAgd2hpbGUoMSl7CiAgICAgICAgICAgICAgICBpZiggZGF0W2ktMV08PTAgJiYgZGF0W2ldPj0wKSBicmVhazsKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBzb2ZmID0gaTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHByaW50ZiggInN0OiVkIGVkOiVkIGFsbDolZFxuIixzb24sc29mZixwY20xLnMuc2l6ZSgpKTsKICAgICAgLy/plovlp4vjgYvjgonntYLkuobjgb7jgacKICAgICAgaW50IGNudCA9IDA7CiAgICAgIGZvciggaW50IGkgPSBzb24gOyBpIDw9c29mZiA7ICl7CiAgICAgICAgLy/vvJHms6LlvaLmir3lh7oKICAgICAgICBkb3VibGUgbWF4ZGlmZiA9LTEwMDAwOwogICAgICAgIGRvdWJsZSBkaWZmOwogICAgICAgIGludCBtYXhwdHI7CiAgICAgICAgZm9yKCBpbnQgaiA9IDgwIDsgaiA8IDI1NSA7IGorKyApewogICAgICAgICAgICBkaWZmPTA7CiAgICAgICAgICAgIGZvciggaW50IGsgPSAwIDsgayA8IGogOyBrKysgKXsKICAgICAgICAgICAgICAgIGRpZmYgKz0gZGF0W2kra10qZGF0W2kraitrXS9qL2o7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIGRpZmY+bWF4ZGlmZiApewogICAgICAgICAgICAgICAgbWF4ZGlmZiA9IGRpZmY7CiAgICAgICAgICAgICAgICBtYXhwdHIgID0gaStqOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8v57WC54K55YmN5b6M44GnY29z5oiQ5YiG44GM5pyA5bCP44Go44Gq44KL54K544KS5o6i44GZCiAgICAgICAgaW50IG1heHB0cjE9bWF4cHRyOzsKICAgICAgICBmb3IoIGludCBrID0gMCA7IGsgPCAxMCA7IGsrKyApewogICAgICAgICAgICBkb3VibGUgYmFzZSA9IGYocGNtMSxpLG1heHB0cjEpOwogICAgICAgICAgICBpZiggZihwY20xLGksbWF4cHRyLWspPGJhc2UgKXsKICAgICAgICAgICAgICAgIG1heHB0cjE9bWF4cHRyLWs7CiAgICAgICAgICAgIH1lbHNlIGlmICggZihwY20xLGksbWF4cHRyK2spPGJhc2UgKXsKICAgICAgICAgICAgICAgIG1heHB0cjE9bWF4cHRyK2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbWF4cHRyID0gbWF4cHRyMTsKICAgICAgICBpbnQgbWlucHRyPW1heHB0cjsKICAgICAgICBwcmludGYoICJPUkc6JWQtIixtaW5wdHItaSk7CiAgICAgICAgZG91YmxlIHN0ID0gaTsKICAgICAgICBkb3VibGUgZWQgPSBtaW5wdHI7CiAgICAgICAgZGZ0KHBjbTEsc3QsZWQpOwogICAgICAgIGlkZnQocGNtMyxlZC1zdCx3cyk7CiAgICAgICAgaSA9IGVkOwogICAgICAgIGNudCsrOwogICAgICB9CiAgICAgIGZjbG9zZSggd3MgKTsKICAgICAgcGNtMy53cml0ZSgiaGkyLndhdiIpOwogICAgICByZXR1cm4gMDsKfQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo=
compilation info
prog.cpp: In function 'void dft(MONO_PCM&, double, double)':
prog.cpp:19:18: error: invalid use of incomplete type 'class MONO_PCM'
int* a = &pcm.s[(int)st];
^
prog.cpp:7:7: note: forward declaration of 'class MONO_PCM'
class MONO_PCM;
^
prog.cpp: In function 'void idft(MONO_PCM&, double, FILE*)':
prog.cpp:90:12: error: invalid use of incomplete type 'class MONO_PCM'
pcm.s.push_back(Re_sum/N);
^
prog.cpp:7:7: note: forward declaration of 'class MONO_PCM'
class MONO_PCM;
^
prog.cpp: In function 'double f(MONO_PCM&, double, double)':
prog.cpp:101:18: error: invalid use of incomplete type 'class MONO_PCM'
int* a = &pcm.s[0];
^
prog.cpp:7:7: note: forward declaration of 'class MONO_PCM'
class MONO_PCM;
^
prog.cpp: In function 'int main(int, char**)':
prog.cpp:121:16: error: aggregate 'MONO_PCM pcm1' has incomplete type and cannot be defined
MONO_PCM pcm1;
^
prog.cpp:122:16: error: aggregate 'MONO_PCM pcm3' has incomplete type and cannot be defined
MONO_PCM pcm3;
^
stdout