Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2018, 16:28   #1
butuy
Новичок
Джуниор
 
Регистрация: 17.05.2018
Сообщений: 1
По умолчанию Реализация алгоритма shazam

Всем, кто может помочь, помогите пожалуйста.... Тема такая, не выходит посчитать амплитуду сигнала.. Не знаю в чем ошибка. Может ошибка в комплексных числах..
Код:
public static void freq() { // создание частотных характеристик

try { 

int chunkSize = 4; // размер скользящего окна 4 кб
byte audio [] = out.toByteArray();
int ts = audio.length; // длина аудиопотока
int ap= ts/chunkSize; // кол-во анализируемых блоков за одну секунду
Complex [][] results = new Complex[ap][]; // создаем массив 
FileWriter lg = new FileWriter("lenght",true); // сохр длину аудиопотока
lg.write("Длина аудиопотока"+ " "+ ts +"\n"); // добавление в файл
lg.close();
FileWriter qn = new FileWriter("quantity",true); // кол-во потоков за одну секнду
qn.write("Количество блоков"+ " "+ ap +"\n"); // добавление в файл
qn.close();



for (int times = 0;times< ap; times++) { // Во внешнем цикле проходим по всем блокам данных и для каждого из них запускаем БПФ-анализ
Complex[] x = new Complex[chunkSize];
for(int i = 0; i<chunkSize; i++) { // Во внутреннем цикле мы помещаем данные из временной области (образцы звука) в комплексные числа с мнимой частью равной 0.
x[i] = new Complex(audio[(times*chunkSize+i)], 0);
}

results[times] = FFT.fft(x); 


}
for (int i = 0; i<ap; i++) {
System.out.println(results[i] +"\n");
}

int [ ] s = new int [ap];
try {
for (int t = 0; t < results.length; t++) {
for (int j = 0; j < results.length; j++) {
double max = 0;
for (int freq = 100; freq < 2000 ; freq++) {
// Получим силу сигнала:
double mag = Math.log(results[t][freq].abs() );
if (max< mag) {
max = mag; 
}
}
s[j] = (int) max;
System.out.println(s[j]);
}
}

//Сохраним самое высокое значение силы сигнала и соответствующую частоту:

} catch(Exception e) {System.out.println("Ошибка в поиске максимальных амплитуд");}


} catch(Exception e) {System.out.println("Ошибка в получении частотных характеристик");}
}

Класс complex
public class Complex {
private final double re; // the real part
private final double im; // the imaginary part

public Complex(double real, double imag)
{
re = real;
im = imag;
}

public String toString()
{
if (im == 0) return re + "";
if (re == 0) return im + "i";
if (im < 0) return re + " - " + (-im) + "i";
return re + " + " + im + "i";
}

public double abs() 
{ return Math.hypot(re, im); } // Math.sqrt(re*re + im*im)
public double phase() 
{ return Math.atan2(im, re); } // between -pi and pi

public Complex sqrt()
{
Complex a = this; // invoking object
double r = Math.sqrt(this.abs());
double theta = this.phase()/2;
return new Complex(r*Math.cos(theta), r*Math.sin(theta));
}

public Complex log()
{
Complex a = this; // invoking object
double x = Math.log(this.abs());
double y = this.phase();
return new Complex(x, y);
}

public Complex plus(Complex b)
{
Complex a = this;
double real = a.re + b.re;
double imag = a.im + b.im;
return new Complex(real, imag);
}

public Complex minus(Complex b)
{
Complex a = this;
double real = a.re - b.re;
double imag = a.im - b.im;
return new Complex(real, imag);
}

public Complex times(Complex b)
{
Complex a = this;
double real = a.re * b.re - a.im * b.im;
double imag = a.re * b.im + a.im * b.re;
return new Complex(real, imag);
}

public Complex times(double alpha)
{ return new Complex(alpha * re, alpha * im); }

public Complex conjugate() { return new Complex(re, -im); }

public Complex reciprocal()
{
double scale = re*re + im*im;
return new Complex(re / scale, -im / scale);
}

public double re() { return re; }
public double im() { return im; }

public Complex divides(Complex b)
{
Complex a = this;
return a.times(b.reciprocal());
}

public Complex exp()
{ return new Complex(Math.exp(re) * Math.cos(im), 
Math.exp(re) * Math.sin(im)); }

public Complex sin()
{ return new Complex(Math.sin(re) * Math.cosh(im), 
Math.cos(re) * Math.sinh(im)); }

public Complex cos()
{ return new Complex(Math.cos(re) * Math.cosh(im), 
-Math.sin(re) * Math.sinh(im)); }

public Complex tan()
{ return sin().divides(cos()); }

public static Complex plus(Complex a, Complex b)
{
double real = a.re + b.re;
double imag = a.im + b.im;
Complex sum = new Complex(real, imag);
return sum;
}

public static Complex neg(Complex z)
{
return new Complex(-z.re(), -z.im());
}

}

Последний раз редактировалось Аватар; 17.05.2018 в 16:34.
butuy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация генетического алгоритма на С не (с++) Alex077 Фриланс 3 02.08.2017 13:53
Реализация венгерского алгоритма(C#) Sterben Помощь студентам 1 29.03.2016 17:24
Реализация алгоритма задачи serfingist Фриланс 2 28.11.2013 14:58
Реализация алгоритма масштабирования DENIS_POLOTSK C# (си шарп) 6 01.06.2012 20:01
реализация алгоритма find_if Progsenya Общие вопросы C/C++ 2 10.09.2010 23:58