Уважаемые знатоки цифровых технологий, помогите пожалуйста отладить алгоритм свертки, не могу найти ошибку. Сделал в c++builder приложение, которое открывает две вавки и делает свертку.
Вот картинка:
http://imageshack.us/photo/my-images/189/convz.jpg/Сверху входной сигнал (синус, 1кГц, 1.17 сек), ниже импульс (0.25 сек.) и внизу результат.
Сначала все идет как надо (сравнивал с аудиоредактором) - переходный процессик и начинается установившийся режим.
Но дальше не могу понять, откуда берется скачок амплитуды и вообще непойми что в конце. Помогите разобраться
Вот текст проги:
//---------------------------------------------------------------------------
#include <stdio.h>
#include <vcl.h>
#pragma hdrstop
#include "sound.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
short format_tag, channels, block_align, bits_per_sample,*sound_buffer;
BYTE id[4];
DWORD size, format_length, sample_rate, avg_bytes_sec, data_size ;
FILE *fp;
short iformat_tag, ichannels, iblock_align, ibits_per_sample,*isound_buffer;
BYTE iid[4];
DWORD isize, iformat_length, isample_rate, iavg_bytes_sec, idata_size ;
FILE *ifp;
unsigned int i,j,k;
float *rsound_buffer;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Label17->Visible=0;
Label18->Visible=0;
Label19->Visible=0;
Label20->Visible=0;
Label21->Visible=0;
Label22->Visible=0;
Label23->Visible=0;
Button2->Enabled=0;
Label7->Visible=0;
Label24->Visible=0;
Label25->Visible=0;
Label26->Visible=0;
Label27->Visible=0;
Label28->Visible=0;
Label29->Visible=0;
Button4->Enabled=0;
}
//----------Читаем описание формата входного файла---------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
fp = fopen("C:/16_44test.wav","rb");
if(fp)
{
fread(id,sizeof(BYTE),4,fp);
if((id[0]=82)|(id[1]=73)|(id[2]=70)|(id[3]=70)) //Check if RIFF
{
fread(&size,sizeof(DWORD),1,fp);
}
else ShowMessage("Not RIFF");
fread(id,sizeof(BYTE),4,fp);
if ((id[0]=87)|(id[1]=65)|(id[2]=86)|(id[3]=69)) //Check if WAVE
{
fread(id,sizeof(BYTE),4,fp); //Read "fmt"
fread(&format_length,sizeof(DWORD),1,fp);
fread(&format_tag,sizeof(short),1,fp);
Label18->Caption=IntToStr(format_tag);
fread(&channels,sizeof(short),1,fp);
Label19->Caption=IntToStr(channels);
fread(&sample_rate,sizeof(DWORD),1,fp);
Label20->Caption=IntToStr(sample_rate);
fread(&avg_bytes_sec,sizeof(DWORD),1,fp);
Label21->Caption=IntToStr(avg_bytes_sec);
fread(&block_align,sizeof(short),1,fp);
Label22->Caption=IntToStr(block_align);
fread(&bits_per_sample,sizeof(short),1,fp);
Label23->Caption=bits_per_sample;
fread(id,sizeof(BYTE),4,fp); //Read DATA subchunk
fread(&data_size,sizeof(DWORD),1,fp); //Read DADA size
Label17->Caption=IntToStr(data_size);
Label17->Visible=1;
Label18->Visible=1;
Label19->Visible=1;
Label20->Visible=1;
Label21->Visible=1;
Label22->Visible=1;
Label23->Visible=1;
Button2->Enabled=1;
}
else
ShowMessage("It is NOT a Wave file!!");
}
else ShowMessage("Shit!!!\nCan't open =(");
}
//-----------Читаем блок данных входного файла, выводим на график-----------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ //создаем входной массив
sound_buffer=(short*)calloc((data_size+idata_size)/2,sizeof(short));
for(i=0;i<=data_size/2;i++) //заполняем его
{
fread(sound_buffer+i,sizeof(short),1,fp);
Chart1->Series[0]->AddXY(i,sound_buffer[i],clRed);
}
}
//--------Читаем описание формата файла импульса-----------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ifp = fopen("C:/impulse.wav","rb");
if(ifp)
{
fread(iid,sizeof(BYTE),4,ifp);
if((iid[0]=82)|(iid[1]=73)|(iid[2]=70)|(iid[3]=70)) //Check if RIFF
{
fread(&size,sizeof(DWORD),1,ifp);
}
else ShowMessage("Not RIFF");
fread(iid,sizeof(BYTE),4,ifp);
if ((iid[0]=87)|(iid[1]=65)|(iid[2]=86)|(iid[3]=69)) //Check if WAVE
{
fread(iid,sizeof(BYTE),4,ifp); //Read "fmt"
fread(&iformat_length,sizeof(DWORD),1,ifp);
fread(&iformat_tag,sizeof(short),1,ifp);
Label24->Caption=IntToStr(iformat_tag);
fread(&ichannels,sizeof(short),1,ifp);
Label25->Caption=IntToStr(ichannels);
fread(&isample_rate,sizeof(DWORD),1,ifp);
Label26->Caption=IntToStr(isample_rate);
fread(&iavg_bytes_sec,sizeof(DWORD),1,ifp);
Label27->Caption=IntToStr(iavg_bytes_sec);
fread(&iblock_align,sizeof(short),1,ifp);
Label28->Caption=IntToStr(iblock_align);
fread(&ibits_per_sample,sizeof(short),1,ifp);
Label29->Caption=ibits_per_sample;
fread(iid,sizeof(BYTE),4,ifp); //Read DATA subchunk
fread(&idata_size,sizeof(DWORD),1,ifp); //Read DADA size
Label7->Caption=IntToStr(idata_size);
Label7->Visible=1;
Label24->Visible=1;
Label25->Visible=1;
Label26->Visible=1;
Label27->Visible=1;
Label28->Visible=1;
Label29->Visible=1;
Button4->Enabled=1;
}
else
ShowMessage("It is NOT a Wave file!!");
}
else ShowMessage("Shit!!!\nCan't open =(");
}
//---------Читаем блок данных файла импульса, выводим на график--------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{ //создаем массив импульса
isound_buffer=(short*)calloc(idata_size/2,sizeof(short));
for(i=0;i<=idata_size/2;i++)
{
fread(isound_buffer+i,sizeof(short),1,ifp);
Chart2->Series[0]->AddXY(i,isound_buffer[i],clRed);
}
}
//------------Собственно свертка---------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{ //создаем выходной массив
rsound_buffer=(float*)calloc((idata_size+data_size)/2,sizeof(float));
k=idata_size/2;
for(j=0;j<=(idata_size+data_size)/2;j++) //семплы результата
{
for(i=0;i<=idata_size/2-k;i++)
rsound_buffer[j]+=isound_buffer[i]*sound_buffer[j-i];
if(k>0)k--;
Chart3->Series[0]->AddXY(j,rsound_buffer[j],clRed);
}
}
//---------------------------------------------------------------------------
ЗЫ Горизонтальные оси чартов не настраивал, это не особо важно - главное, форму сигнала видно.