Форум программистов, компьютерный форум CyberForum.ru

Анализатор звука - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Написать перегруженные функции разных типов, вычисляющие сумму геометрической прогрессии рекуррентным способом. http://www.cyberforum.ru/cpp-beginners/thread614850.html
ребят нужна помощь Задачи по программированию. Задача решается на двух языках. Задача 20. Написать перегруженные функции разных типов, вычисляющие сумму геометрической прогрессии рекуррентным способом.
C++ Написать перегруженные функции разных типов, вычисляющие сумму арифметической прогрессии рекуррентным способом. ребят нужна помощь Задачи по программированию. Задача решается на двух языках. Задача 19. Написать перегруженные функции разных типов, вычисляющие сумму арифметической прогрессии рекуррентным способом. http://www.cyberforum.ru/cpp-beginners/thread614848.html
C++ Написать функцию булевского типа, проверяющую попадание точки с заданными координатами в треугольник с вершинами в точках (1,1) (0,2) (-1,0)
ребят нужна помощь Задачи по программированию. Задача решается на двух языках. Задача 2. Написать функцию булевского типа, проверяющую попадание точки с заданными координатами в треугольник с вершинами в точках (1,1) (0,2) (-1,0) очень нужно к восьми утра!!
C++ Написать функцию булевского типа, проверяющую наличие в файле записи с заданным ключём.
ребят нужна помощь Задачи по программированию. Задача решается на двух языках. Задача 18. Написать функцию булевского типа, проверяющую наличие в файле записи с заданным ключём.
C++ Написать булевскую функцию, проверяющую упорядоченность файла. http://www.cyberforum.ru/cpp-beginners/thread614843.html
ребят нужна помощь Задачи по программированию. Задача решается на двух языках. Задача 17. Написать булевскую функцию, проверяющую упорядоченность файла.
C++ Написать функцию целого типа, вычисляющую сумму геометрической прогрессии рекуррентным способом. ребят нужна помощь Задачи по программированию. Задача решается на двух языках. Задача 16. Написать функцию целого типа, вычисляющую сумму геометрической прогрессии рекуррентным способом. подробнее

Показать сообщение отдельно
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
27.06.2012, 22:37     Анализатор звука
На входе:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// data[i][0] - real part - сэмпл одного канала в масштабе от [0..1]
// data[i][1] - imagine part - 0 (ноль)
// len_pow - размер data[], где len_pow степень двойки (например: 2^10 - 1024 сэмпла)
void fft( float (*data)[2], int len_pow )
{
    int     len;
    int     n1, n2, n4;
    int     i0, i1, i2, i3;
    int     i, j, k, m, id, isxx;
    float   a, e, r1, r2, s1, s2, s3;
    float   a3, ss1, ss2, cc1, cc2;
 
    len = 1 << len_pow;
 
    n1 = len - 1;
    n2 = len << 1;
    for ( k = 1; k < len_pow; k++ ) {
        n2 >>= 1;
        n4 = n2 >> 2;
        e = (PI * 2) / (float)n2;
        a = 0.0;
        for ( j = 1; j <= n4; j++ ) {
            a3 = a + a + a;
            ss1 = sin( a );
            ss2 = sin( a3 );
            cc1 = cos( a );
            cc2 = cos( a3 );
            isxx = j;
            id = n2 << 1;
            while ( isxx < len ) {
                for ( i0 = isxx - 1; i0 < n1; i0 += id ) {
                    i1 = i0 + n4;
                    i2 = i1 + n4;
                    i3 = i2 + n4;
 
                    r1 = data[i0][0] - data[i2][0];
                    data[i0][0] += data[i2][0];
 
                    r2 = data[i1][0] - data[i3][0];
                    data[i1][0] += data[i3][0];
 
                    s1 = data[i0][1] - data[i2][1];
                    data[i0][1] += data[i2][1];
 
                    s2 = data[i1][1] - data[i3][1];
                    data[i1][1] += data[i3][1];
 
                    s3 = r1 - s2;
                    r1 += s2;
                    s2 = r2 - s1;
                    r2 += s1;
 
                    data[i2][0] =  r1 * cc1 - s2 * ss1;
                    data[i2][1] = -s2 * cc1 - r1 * ss1;
                    data[i3][0] =  s3 * cc2 + r2 * ss2;
                    data[i3][1] =  r2 * cc2 - s3 * ss2;
                }
                isxx = (id << 1) - n2 + j;
                id <<= 2;
            }
            a = (float)j * e;
        }
    }
 
    /* last stage, length = 2 butterfly */
    isxx = 1;
    id = 4;
    while ( isxx < len ) {
        for ( i1 = isxx; i1 <= len; i1 += id ) {
            i0 = i1 - 1;
            r1 = data[i0][0];
            data[i0][0] = r1 + data[i1][0];
            data[i1][0] = r1 - data[i1][0];
            r1 = data[i0][1];
            data[i0][1] = r1 + data[i1][1];
            data[i1][1] = r1 - data[i1][1];
        }
        isxx = (id << 1) - 1;
        id <<= 2;
    }
 
    /* bit reverse counter */
    j = 0;
    for ( i = 0; i < len - 1; i++ ) {
        if ( i < j ) {
            r1 = data[i][0];
            data[i][0] = data[j][0];
            data[j][0] = r1;
            r1 = data[i][1];
            data[i][1] = data[j][1];
            data[j][1] = r1;
        }
        k = len >> 1;
        while ( k <= j ) {
            j -= k;
            k >>= 1;
        }
        j += k;
    }
}
На выходе данные по этим же адресам но их в два раза меньше, извлекаются так:
C
1
v = sqrt( data[x][0] * data[x][0] + data[x][1] * data[x][1] ) / sqrt( N );
, где N - кол-во входных сэмплов / 2.

P.S.: Тут фигурируют комплексные числа и Быстрое Преобразование Фурье, поэтому разобраться не так уж легко...
Есть бесплатная библиотека FMOD Ex, которая может сделать за тебя это преобразование.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru