Автор работы: Пользователь скрыл имя, 20 Марта 2012 в 17:21, курсовая работа
Цифровые фильтры могут быть созданы на основе их импульсной реакции, поскольку коэффициенты фильтра с конечной импульсной характеристикой (КИХ) идентичны дискретной импульсной реакции фильтра.
В данной работе рассмотрено прямое и обратное преобразования Фурье, принципы математического описания и анализа дискретных сигналов, а также обработка сигнала с помощью фильтров.
Введение
2. Постановка задачи
3. Дискретизация сигнала
4. Квантование сигнала
5. Прямое и обратное преобразование Фурье
6. Фильтрация сигнала
7. Структура WAV файла
8. Инструкция пользователя
9. Заключение
10. Список источников
11. Листинг программы
// Процедура ОБПФ
complex <double> *S = new std::complex<double>[ ch.N ] ;
int i=0,n=0,teknum,adr,j=0;
double tmp;
while(i<ch.N)
{
j=Reverse(i,ch.Power);
S[i]=ch.c[j];
i++;
}
i=1;
complex <double> Tmp,W;
while(i<ch.N) // определяет порядок коэффициентов Фурье
{
n=0;
while(n<i)
{
teknum=0;
W=Ww(-n,i<<1);
while(teknum<ch.N/2/i)
{
adr=teknum*(i<<1)+n;
Tmp=S[adr];
S[adr]=Tmp+W*S[adr+i];
S[adr+i]=Tmp-W*S[adr+i];
teknum++;
}
n++;
}
i=i<<1;
}
i=0;
ch.subSignal = new long[ch.size];
while(i<ch.N)
{
ch.restData[i]=S[i].real();
i++;
}
ch.MSE=0;
//запись разностного сигнала
for (i=0;i<ch.size;i++)
{
ch.subSignal[i] = ch.data[i]-ch.restData[i];
ch.MSE+=abs(ch.subSignal[i]);
}
ch.MSE = ch.MSE/ch.size;
}
//
int WAV::Reverse(int index,int power)
{
//зеракльно отображает биты в числе: 101000 -> 000101
int i=1,j=0;
while(i<power)
{
if(index%2==1)
{j++;}
else
{}
index=index>>1;
j=j<<1;
i++;
}
if(index%2==1)
{j++;}
else
{}
return j;
}
//---Нормализация
void WAV::Norm(Channel &ch)
{
double NORM=ch.N;
int i = 1;
while(i<ch.N-1)
{
ch.c[i]=ch.c[i]/(NORM);
i++;
}
ch.c[0]=ch.c[0]/(NORM);
ch.c[ch.N-1]=ch.c[ch.N-1]/(
}
//----------------------------
//---запись в файл
void WAV::WriteFile(Channel ch1, Channel ch2)
{
FILE *file;
char *data_tmp;
long *RestoreData = new long[HData.Len];
unsigned short int tmp;
//открытие файла
file = fopen(strcat(getFileName(),"
fwrite(&HRiff, sizeof(RIFF), 1, file);
fwrite(&HWave, sizeof(WAVE), 1, file);
fwrite(&HData, sizeof(DATA), 1, file);
int j=0;
int t1,t2;
for (int i=0;i<ch1.size;i++)
{
tmp = (ch1.restData[i]);
fwrite(&tmp, kolByte,1,file);
tmp = (ch2.restData[i]);
fwrite(&tmp, kolByte,1,file);
j+=2;
}
fclose(file);
}
//---фильтрация сигнала
void WAV::Filter(Channel &ch)
{
int j=0;
double f;
int hh;
f = ch.N;
hh = (HData.Len/HWave.
for (int i=0;i<ch.N;i++)
{
if ((i/hh)<600)
{
ch.Amplitude[i]=0;
ch.c[i].real(0);
}
}
}
//квантование сигнала
bool WAV::Kvant(Channel &ch, int lvl)
{
float minLevel, maxLevel,maxYLevel; //минимальный и максимальный уровни сигнала
int i,j;
long tmp_el;
bool flag;
long tmp;
ch.kvant.kvantLevel = lvl;
ch.kvant.levels = new long[ch.kvant.kvantLevel+1];
//поиск мин и макс уровня сигнала
minLevel = ch.data[0]; maxLevel = ch.data[0];
for (i=0;i<ch.size;i++)
{
if(ch.data[i]>maxLevel) maxLevel = ch.data[i];
if(ch.data[i]<minLevel) minLevel = ch.data[i];
}
long d1;
d1 = ch.data[0];
d1 = ch.data[0];
ch.kvant.step = (maxLevel - minLevel)/ch.kvant.kvantLevel;
tmp = ch.kvant.step;
maxYLevel = maxLevel;
//запись уровней квантования в массив arrKvantLevel
for (i=0;i<ch.kvant.kvantLevel+1;
{
ch.kvant.levels[i] = System::Math::Round(minLevel + i*ch.kvant.step);
}
//квантование данных
d1 = ch.data[0];
double d2;
ch.kvant.data = new long[ch.size];
for (i=0;i<ch.size;i++)
{
if(i==110)
d1 =0;
d1=ch.data[i];
for(j=0;j<ch.kvant.kvantLevel;
{
d2 = ch.kvant.levels[j];
d2 = ch.kvant.levels[j+1];
if ((ch.data[i]>=ch.kvant.levels[
{
//округление до значения квантования
tmp_el =ch.kvant.levels[j] + ch.kvant.step/2;
if(ch.data[i]>=tmp_el)
ch.kvant.data[i] = ch.kvant.levels[j+1];
else
ch.kvant.data[i] = ch.kvant.levels[j];
}
}
}
return true;
}
complex <double> WAV::Ww(int nn,int NN)// :Ww(int nn,int NN)
{
complex <double> I(0,1);
double nnn=nn;
double NNN=NN;
return exp(-I*M_PI*2.0*nnn/NNN);
}
Файл работы со звуковым заданным файлом(WAV.h)
#pragma once
#include <cmath>
#include <vector>
#include <iostream>
#include <complex>
#include <vcclr.h>
#include <stdlib.h>
#define M_PI 3.14159265358979323846
using namespace std;
using namespace System::Runtime::
class WAV
{
private:
struct RIFF {
char ID[4]; // четыре буковки "RIFF"
long Len; // длина файла без этого заголовка
};
struct WAVE {
char ID[4]; // "WAVE" - заголовок WAV
char Fmt[4]; // "fmt " - thunk формата
long Len; // длинна етого thunka
short int Format; // собственно формат
short int Channels; // число каналов (1/2)
long SamplesPerSecond; // отсчетов/сек
long AvgBytesPerSecond; // байтов/сек
short int BlockAlign; // выравнивание блоков
short int BitsPerSample; // битов на отсчет
};
struct DATA {
char ID[4]; // "data"
long Len; // длина этого thunkа (должен быть выровнен на
// границу слова)
};
struct KVANT
{
int kvantLevel;
long *levels;
long *data;
float step;
};
struct Channel
{
long *data; //начальные данные канала
long *sigData;
int size; //размер данных
double *Amplitude; //амплитуды
int N;
complex <double> *c;
int Power;
long *restData; //восстановленные данные
long *subSignal; //данные разностного сигнала
KVANT kvant;
bool restored;
bool spectr;
double MSE;
};
char *FileName; //имя файла
long kolByte; //кол-во байт для образзца
void Norm(Channel &ch);
int Reverse(int index,int power);
public:
int dataSize; //размер данных (всех каналов)
//WAV(){lChannel.Power = 18; rChannel.Power = 18;};
RIFF HRiff;
WAVE HWave;
DATA HData;
long *data;
Channel lChannel,rChannel;
void SetFileName(System::String^ wavFile);
bool WAVRead();
void RejectFilter(double *arrPer, int *n);
void FFT(Channel &ch);
void RFFT(Channel &ch);
void WriteFile(Channel ch1, Channel ch2);
char *getFileName();
void Filter(Channel &ch);
bool Kvant(Channel &ch, int lvl);
complex <double> Ww(int nn,int NN);
};