Обработка дискретных сигналов

Автор работы: Пользователь скрыл имя, 20 Марта 2012 в 17:21, курсовая работа

Краткое описание

Цифровые фильтры могут быть созданы на основе их импульсной реакции, поскольку коэффициенты фильтра с конечной импульсной характеристикой (КИХ) идентичны дискретной импульсной реакции фильтра.
В данной работе рассмотрено прямое и обратное преобразования Фурье, принципы математического описания и ана­лиза дискретных сигналов, а также обработка сигнала с помощью фильтров.

Содержание работы

Введение
2. Постановка задачи
3. Дискретизация сигнала
4. Квантование сигнала
5. Прямое и обратное преобразование Фурье
6. Фильтрация сигнала
7. Структура WAV файла
8. Инструкция пользователя
9. Заключение
10. Список источников
11. Листинг программы

Содержимое работы - 1 файл

обработка WAV файла.doc

— 305.00 Кб (Скачать файл)

              // Процедура ОБПФ

              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]/(NORM);

}

//---------------------------------------------------------------------------

 

//---запись в файл

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(),"restored.wav"), "wb");

 

              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.AvgBytesPerSecond);

              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;i++)

              {

                            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;j++)

                            {

                                          d2 = ch.kvant.levels[j];

                                          d2 = ch.kvant.levels[j+1];

                                          if ((ch.data[i]>=ch.kvant.levels[j])&&(ch.data[i]<=ch.kvant.levels[j+1]))

                                          {

                                                       

                                                        //округление до значения квантования

                                                        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::InteropServices;

 

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);

};



Информация о работе Обработка дискретных сигналов