Member 12464144 Ответов: 1

Как добраться спектра аудо файл через мексиканскую шляпу


У меня есть звуковой файл с расширением wav. Я получил амплитудные значения этого файла. Затем я сгенерировал значения вейвлета мексиканской шляпы, используя y = (1-t*t)*exp(-1*t * t/2). Теперь мне нужно получить спектр этого аудиофайла. Как это сделать. Вот мой код

Что я уже пробовал:

#include <iostream>
#include "WavData.cpp"
#include <graphics.h>
#include<stdio.h>
#include<math.h>

#define PI 3.141592653589793238462643383279502884197169399375105820974
using namespace std;
using namespace yazz::audio;
//drawing function
void DrawSamples(const double* source, int dataLen, int start, int finish){
 for(int i = start; i < finish; i++){
        if(i == start) moveto((getmaxx()-30)*i/(finish - start)+10, getmaxy()/2 - source[i]);
        else
        lineto((getmaxx()-30)*i/(finish - start)+10, getmaxy()/2 - source[i]);
        }
     }
/**************mexican hat(ricker) function*************************************/
double Mhat(double time, double a, double b)
{
   double mhat;
   mhat = 200*(2/(sqrt(3)*pow(PI, 1./4)))*(1-pow((time-b)/a,2))*exp(-1*pow((time-b)/a,2)/2);
   return mhat;
           }
/**************************************************/

int main(){    
WavData* wavData = WavData::readFromFile("son.wav");//read aduio file
const double *normalizedData = wavData->getNormalizedData();//to get values of audio file
int dataLength = wavData->getNumberOfSamples();//to get length of audio file values

/******************************************/
initwindow(1300, 600, "Mexican hat", 0, 0, false, true);
setbkcolor(WHITE);
cleardevice();
setcolor(CYAN);
/******************ricker*************************/
//generate mexican hat
double m = -5, n = 5, dt = 0.15625, a = 1, b = 0;//dt = 0.15625
int length = (n - m)/0.15625;//0.15625

double* time = new double[length];
//fill time[]
for(int i = 0; i < length; i++)
{
        time[i] = m;
        m = m + dt;
        }

double* mhat = new double[length];
//here I get values of mexican hat wavelet
for(int j = 0; j < length; j++){
mhat[j] = Mhat(time[j], a, b);
}

//now what need I to do

 delete[] normalizedData;
 delete[] time;
 delete[] mhat;

getch();    
return 0;
}

1 Ответов

Рейтинг:
1

Rick York

Обычная методика получения спектра сигнала заключается в использовании преобразования Фурье, чаще всего БПФ. Есть один пример программы на эта страница[^].

Кстати, вы можете предпочесть включить math.h с определенным макросом _USE_MATH_DEFINES. Этот файл содержит определения наиболее распространенных математических констант, таких как pi, e и т. д. Значение числа Пи определяемый константой M_PI.


Member 12464144

Я знаю, как получить спектр с помощью БПФ. Но я должен получить спектр с помощью вейвлета мексиканской шляпы. Потому что это моя дипломная работа

Rick York

Если вы знаете, как получить спектр сигнала с помощью БПФ, то в чем проблема? Сигнал есть сигнал. Это может быть случайный шум, это может быть синусоидальная волна, это может быть песня с компакт-диска. Какое это имеет значение? Пока у вас есть несколько точек данных для выборки, у вас должно быть все необходимое, чтобы это произошло.