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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
tomaticus
47 / 47 / 2
Регистрация: 02.01.2011
Сообщений: 505
#1

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

27.06.2012, 12:05. Просмотров 1636. Ответов 8
Метки нет (Все метки)

Собственно, как его организовать? Что-то порылся в гуглу, ничего не нашел.
Может я неправильно выражаюсь, но я про "эквалайзер", который подскакивает при различных звуках. Например в плеерах.
Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2012, 12:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Анализатор звука (C++):

Анализатор - C++
Просто подскажите в чем ошибка ? ( не компелируется) #include <fstream> #include <iostream> #include <string> using namespace...

синтаксический анализатор - C++
Доброго времени суток. Подскажите как написать синтаксический анализатор кода(паскаль). Как это правильно делать? как это сделано в средах...

Строковый анализатор - C++
Подскажите почему код выдает всякий мусор, подает звуковые сигналы Должен работать так: Если введешь так: "11/23/34" или "11.23.34"...

Лексический анализатор - C++
Написал программу, я надеюсь, лексического анализатора для конкретного куска программы. В программе я из текстового файла считывал текст...

Текстовой анализатор - C++
написать программу, определяющую корректность выражения, содержащего только арифметические операции и присваивание.

Анализатор кода - C++
Есть исходный файл (код C++) программы. Нужно создать дамп с анализом его содержимого. Например: #include <iostream> void func(int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
27.06.2012, 12:11 #2
Цитата Сообщение от tomaticus Посмотреть сообщение
Анализатор
Цитата Сообщение от tomaticus Посмотреть сообщение
эквалайзер
Цитата Сообщение от tomaticus Посмотреть сообщение
подскакивает
Какие-то не совместимые между собой термины. Лично я ничего не понял.
0
tomaticus
47 / 47 / 2
Регистрация: 02.01.2011
Сообщений: 505
27.06.2012, 12:12  [ТС] #3
lazybiz, секунду)
0
tomaticus
47 / 47 / 2
Регистрация: 02.01.2011
Сообщений: 505
27.06.2012, 12:15  [ТС] #4
this
0
Изображения
 
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
27.06.2012, 12:32 #5
Аа.. анализатор спектра тебе нужен. Это делается через FFT. Вечером смогу кинуть пример.
1
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 12:44 #6
Цитата Сообщение от tomaticus Посмотреть сообщение
Собственно, как его организовать? Что-то порылся в гуглу, ничего не нашел.
Может я неправильно выражаюсь, но я про "эквалайзер", который подскакивает при различных звуках. Например в плеерах.
Спасибо.
- апроксимируй волну рядом Фурье. Максимумы АЧХ будут соответствовать наиболее ощущаемым ухом частотам из спектра сигнала (частотам у которых наибольшая амплитуда волн). Эквалайзер - чатотный фильтр, который обрезает ненужные участки спектра и оставляет нужные, последующий усилитель сигнала позволяет добиться разницы между нужным и ненужным в десятки децибел.

Не по теме:

Как писать всё это? По моему мнению это не тема для простого раздела, могу показать как это делать в роли фрилансера...



Добавлено через 2 минуты
Могу помочь ссылкой на DirectSound плеер
Шумящие биты в WAV (нужен вариант 2)
в программе при желании и усердии можно отыскать данные волны, ну а дальше делаем разложение в ряд и т.д.
1
tomaticus
47 / 47 / 2
Регистрация: 02.01.2011
Сообщений: 505
27.06.2012, 15:15  [ТС] #7
все, понял. моему уму это не под силу.
спасибо всем.
0
raxp
10162 / 6549 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
27.06.2012, 20:38 #8
...tomaticus, зайдите на офсайт BASS и скачайте либу с примерами, там есть готовый анализатор спектра.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
27.06.2012, 22:37 #9
На входе:
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, которая может сделать за тебя это преобразование.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 22:37
Привет! Вот еще темы с ответами:

Синтаксический анализатор - C++
Нужна помощь именно с алгоритмом. Задание звучит так - проверить корректность написания заголовка функции. Прототипы не учитываются. ...

Лексический анализатор - C++
Получил задание. Ранее с++ не изучал. Если найдутся добрые люди, которые могут помочь, отзовитесь, пожалуйста. Разработать лексический...

лексический анализатор на С++ - C++
Написать лексический анализатор на С++: разделители: , . ; бинарные операции: + - * / унарные операции: - знак числа ...

Анализатор строки - C++
Программа должна обработать строку AA;AA(AA;AA) из файла и вывести что все нормально. Но у меня не получается. Действия выполняются...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.06.2012, 22:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru