Форум программистов, компьютерный форум, киберфорум
Цифровая обработка сигналов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/294: Рейтинг темы: голосов - 294, средняя оценка - 4.82
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371

Как узнать частоту звука?

20.01.2012, 16:11. Показов 63436. Ответов 252
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
народ,подскажите кто знает.обработкой сигнала нигода не занимался,поэтому если что-то говорю не правильно хочу программно определить к какой ноте принадлежит звук. Имею частоту дискретизации 8кГц и глубину 16 бит. значения этой выборки заносятся в массив.
1)Что представляют из себя эти значения?
если я правильно понял то каждый элемент массива это значение частоты в момент времени?
2)что нужно сделать с этим массивом чтобы узнать ноту?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.01.2012, 16:11
Ответы с готовыми решениями:

Как менять частоту звука на STM32
Всем привет, на курсовую дали вот такое задание "Разработать МК устройство которое позволяет в зависимости от нажимаемой кнопки изменять...

Узнать из программы частоту процессора
Приветствую. Подскажите способ узнать из программы частоту процессора (ATMiko32, впрочем хотелось бы универсальный ваирант).

Как узнать частоту звука без сторонних библиотек
кто нибудь знает как в работать со звуком без сторонних библиотек? мне нужно чтобы во время проигрывания звука можно было узнать его...

252
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.01.2012, 16:52
Типа "гитарного тюнера" ?

1- нет, это отсчеты, значения амплитуд
2- преобразование Фурье, в частности БПФ ...далее домножение на окно и нормализация с выборкой в соответствии с частотами нот.

Раздел "Электроника". На чем делать будете, МК, ПЛИС? Алгоритм "Элм-Чена" достаточно быстр.

обработкой сигнала нигода не занимался
ЛИТЕРАТУРА ПО ЦОС:
- Обработка сигналов / Юкио Сато
- Основы спектрального анализа / К.Раушер
- Цифровые фильтры / Уолт Кестер
- Калмановская фильтрация / S.Padmakumar, V.Agarval, R.Kallol
- Дискретные системы / Уолт Кестер
- Быстрое преобразование Фурье и алгоритмы вычисления сверток / Г.Нуссбаумер
- Алгоритмические трюки для программистов / Уоррен Генри

Конечно, есть еще метод пяти ординат для быстрого получения полос спектра, но вам точность нужна повыше ...из практики ознакомтесь со следующим:
- http://arv.radioliga.com/downloads.any/video_2.mp4
- http://arv.radioliga.com/content/view/98/44
- http://www.youtube.com/watch?v=1FHn8mmOyDQ
- http://cxema.at.ua/publ/10_ti_... a/1-1-0-34
2
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
20.01.2012, 17:18  [ТС]
Спасибо за быстрый ответ.да,что то типо того.Если я все правильно понимаю ни МК ни ПЛИС мне не надо. Выборка производится средствами О.С. а мне надо обработать выборку.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.01.2012, 17:51
ни МК ни ПЛИС мне не надо. Выборка производится средствами О.С
Стоп. Не зря ведь я сделал акцент на раздел "Форум Электроника и электротехника". Данная тема в нем и причем тут ОС? Cреда Windows, линукс ?

ОК, вот вам как основа - материал: "Cпектроанализатор своими руками" http://raxp.radioliga.com/cnt/s.php?p=v3.djvu


Отдельно - Модуль DTMF (кодер-декодер-спектроанализатор). Компонент.
Миниатюры
Как узнать частоту звука?  
0
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
20.01.2012, 18:52  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
Стоп. Не зря ведь я сделал акцент на раздел "Форум Электроника и электротехника".
иногда возникают такие ситуации,что надо разобраться в азах незнакомой области(в данном случае электроника и конкретно сигналы),чтобы решить свою задачу.Делаю в Android средствами о.с. происходит опрос микрофона,а я пытаюсь в режиме он-лайн определить частоту сигнала.
, а конкретно,разобрать на ноты. Т.е обработка raw записи.
Цитата Сообщение от raxp Посмотреть сообщение
Данная тема в нем и причем тут ОС?
а к какой теме принадлежит этот вопрос?
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.01.2012, 21:22
Делаю в Android средствами о.с. происходит опрос микрофона
это какими? Cреда разработки, эклипс?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
20.01.2012, 21:43
в андроиде одно средство - java, а eclipse или какая другая ide - не важно. Eclipse на мой взгляд самая удобная. Задача проста - написать fft на яве (хотя зачем писать - реализаций полно). Недавно для интереса делал нечто подобное, тока fft использовал на c++, и прикручивал с помощью ндк. (собственно это и была моя задача - попробовать ндк в деле)
0
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
21.01.2012, 11:38  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
это какими?
Использую класс AudioRecord,среда netbeans.
Цитата Сообщение от vital792 Посмотреть сообщение
Задача проста - написать fft на яве (хотя зачем писать - реализаций полно)
я в принципе и буду использовать ява библиотеку jfftpack,но хотелось бы узнать как она работает(физику процесса обработки сигнала)а то не понятно,что и как обрабатывать из полученных данных!Может не поленитесь и разложите на пальцах,а то я что то заступарился.Как я себе это вижу:
С помощью класса AudioRecord я настраиваю частоту дескретизации и глубину,потом делаю первую считку,все значения заносятся в массив,этот массив подаю на обработку БПФ,новый полученный массив содержит значения в Гц которые можно сопоставить с значениями нот?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
21.01.2012, 12:19
Цитата Сообщение от lavan Посмотреть сообщение
новый полученный массив содержит значения в Гц которые можно сопоставить с значениями нот?
на выходе функции бпф получишь комплексный массив коэффициентов бпф. Возьмешь от него модуль - получишь амплитудный спектр (некоторые реализации сразу его и возвращают, не знаю как jfftpack)
В этом массиве находишь максимум и смотришь какой частоте он соответствует (по простой пропорции - длина массива = частота дискретизации, позиция максимума = искомая частота) И смотришь какой ноте это соответствует. Кстати максимум должен сильно выделяться на фоне остальных частот - а то так и в белом шуме можно распознать ноты - ну это ты уже сам продумай.
И кстати неплохо бы перед этим умножить на оконную функцию (любую, какая нравится) для локализации
1
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492
27.02.2012, 22:03
lavan, Когда то занимался, может поможет.
https://www.cyberforum.ru/cpp-... 06725.html
0
0 / 0 / 0
Регистрация: 28.04.2012
Сообщений: 7
28.04.2012, 07:16
Lavan, здравствуй!!! у меня дипломка на твою тему, помоги, где найти цифровом виде ноты?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
28.04.2012, 08:27
Цитата Сообщение от Samat90 Посмотреть сообщение
где найти цифровом виде ноты?
Samat90, первая ссылка в гугле по запросу "частоты нот" http://www.gitaristam.ru/school/frequency.htm
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
28.04.2012, 09:33
цифровом виде ноты
второй скрин поста #4.
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
12.04.2013, 15:23
Как сделать, чтоб частота показывалась в консоли с определенной периодичностью?
Сейчас насоветовали для захвата звука http://www.portaudio.com/ (PortAudio is a free, cross-platform, open-source, audio I/O library. It lets you write simple audio programs in 'C' or C++ that will compile and run on many platforms including Windows, Macintosh OS X, and Unix (OSS/ALSA).)
И для определения частоты http://www.fftw.org/ . Хотя есть много других библиотек.
С чего начать? Как получить массив звуковых данных?
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
13.04.2013, 20:12
Разбираюсь с PortAudio. Скачал архив, перекинул из папки include 9 заголовочных файлов в такую же папку у компилятора. В папке examples выбрал paex_sine, исходник на си. Но при попытке компиляции программы ругается.
Прочитал portaudio.com/docs/v19-doxydocs/tutorial_start.html что после скачивания это всё надо компилировать. Подскажите, как это сделать в кодеблоксе? Компилятор MinGW-4.7.1. По нему даже страница есть http://portaudio.com/docs/v19-... mingw.html Подскажите, что делать?

Добавлено через 3 часа 33 минуты
Подсказали где взять готовый файл
http://code.google.com/p/porta... l&can=2&q=
PortAudio precompiled Win32 binary (v0.19 build 1899 with MME, DS and ASIO)
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
14.04.2013, 00:47
Оказывается одним файлом не обойтись. Нашел. В приложении три файла
portaudio.h - заголовочный файл
portaudio_x86.dll - динамическая библиотека
portaudio_x86.lib - файл импорта, его нужно прописывать в настройках компилятора, в линкере вашей среды разработки.
Уже получилось скомпилировать пример paex_sine и послушать синусоиду
Вложения
Тип файла: zip portaudio_h_dll_lib.zip (60.3 Кб, 43 просмотров)
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
15.04.2013, 10:40
Сейчас скачиваю библиотеку с преобразованием фурье - http://www.fftw.org/install/windows.html
Хорошо, что тут есть уже готовые архивы. Люди, кто-нибудь с подобным связывался? Подсказывайте пожалуйста. Сложно в одиночку разбираться. Можно в личку.

Добавлено через 17 часов 33 минуты
Нашел пример в котором идет запись звука в массив (оно то нам и надо), и проигрывается. Если в 56 строчке поставить #define WRITE_TO_FILE (1) то звук еще в файл запишется.
Итак, массив звука можно считать. Помогите с подключением fft?
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
18.04.2013, 19:37
Нашел. В вышеприведенном архиве нет файлов .lib. По этой ссылке они есть. Теперь эту библиотеку можно линковать в кодеблокс.
ftp://ftp.fftw.org/pub/fftw/fftw3win32mingw.zip
содержание - fftw3.def fftw3.dll fftw3.exp fftw3.h fftw3.lib
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
15.05.2013, 09:50
Из файла paex_read_write_wire (из примеров) сделал такое.
Программа скидывает семплы в буфер (4096 штук примерно 0.1 секунды). Тип float. Перебором ищем максимальный семпл и в процентах выводим его на экран. Таким образом отображается громкость сигнала. Если молчать, показывает 3 или 4, если в плотную говорить показывает 100. Чувствительность зависит от настройки микрофона в системе. Теперь цель - считанный массив отправить на фурье и найти основную частоту. Как?
C
1
2
3
4
5
6
7
8
9
    while(1){
        Pa_ReadStream( stream, sampleBlock, FRAMES_PER_BUFFER );
        max_sample=0;
        for (j=0; j<FRAMES_PER_BUFFER; ++j)
        {
            if (sampleBlock[j] > max_sample) max_sample=sampleBlock[j];
        }
        printf("Amplitude= %.0f   \r",max_sample*100);
   }
Добавлено через 19 часов 38 минут
Получилось. Получаем буфер, и отправляем указатель в функцию FFT. Сама функция взята с вики, без библиотеки. Единственное условие - степень двойки. Проблема - возвращает неточные значения с погрешностью до десятка герц. Как можно обработать полученный массив, чтоб точность возросла до десятых или сотых герца?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
while(1)
    {
        Pa_ReadStream( stream, sampleBlock, FRAMES_PER_BUFFER ); //читаем из потока в буфер       
        for(i=0; i<FRAMES_PER_BUFFER; i++) Im[i] = 0.0;  // обнуляем мнимую часть
        FFT(sampleBlock, Im, FRAMES_PER_BUFFER, POW_2, -1); // указатель,0,отсчёты,степень
 
        // определяем позицию в начале массива с максимальным вектором
        max_ampl=0;
        max_i=0;
        for(i=5; i<FRAMES_PER_BUFFER/100; i++)
        {
            len_vector=sampleBlock[i]*sampleBlock[i]+Im[i]*Im[i];
            if (len_vector>max_ampl)
            {
                max_ampl=len_vector;
                max_i=i;
            }
        }
        printf("Freq= %f    \r",(float)max_i*SAMPLE_RATE/FRAMES_PER_BUFFER);
    }
0
31 / 31 / 5
Регистрация: 05.02.2013
Сообщений: 245
Записей в блоге: 8
20.05.2013, 07:48
Вот что получилось в итоге. У кого есть пианино или гитара, можете поиграть и проверить работоспособность. Единственная проблема - поиск точной частоты. В примере я грубо беру три точки, рисую по ним параболу, беру вершину. А надо бы поточнее, как то по другому. Прошу комментарии, предложения, проблемы.
файл main.c
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "portaudio.h"
 
 
#define SAMPLE_RATE (44100)
//       N    = 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384;
//       LogN = 2, 3,  4,  5,  6,   7,   8,   9,   10,   11,   12,   13,    14;
#define FRAMES_PER_BUFFER (16384)
#define POW_2 (14)
#define NUM_CHANNELS (1)
 
/* Select sample format. */
#define PA_SAMPLE_TYPE paFloat32
#define SAMPLE_SIZE (4)
#define SAMPLE_SILENCE (0.0f)
#define CLEAR(a) memset( (a), 0, FRAMES_PER_BUFFER * NUM_CHANNELS * SAMPLE_SIZE ) // обнуление массива
#define PRINTF_S_FORMAT "%.8f"
 
#define  NUMBER_IS_2_POW_K(x)   ((!((x)&((x)-1)))&&((x)>1))  // x is pow(2, k), k=1,2, ...
#define  FT_DIRECT        -1    // Direct transform.
#define  FT_INVERSE        1    // Inverse transform.
 
struct
{
    int num;
    char letter[5];
    float freq;
    float freq_down;
    float freq_up;
} note[128];
 
void FreqOfNotes();
int FFT();
void VerPar(float x1,float y1,float x2,float y2,float x3,float y3);
float X0, Y0;
 
int main()
{
    printf("Note from mic\n");
 
    FreqOfNotes();// заполняем структуру нот
 
    PaStreamParameters inputParameters;
    PaStream *stream = NULL;
    //PaError err;
    float *sampleBlock,len_vector;
    int i,j,note_real;
    int max_ampl_1,max_ampl_2;
    int max_i, max_i_1,max_i_2;
    int numBytes;
    float Im[FRAMES_PER_BUFFER],freq_real;
 
    printf("patest_read_write_wire.c\n");
    fflush(stdout);
 
    numBytes = FRAMES_PER_BUFFER * NUM_CHANNELS * SAMPLE_SIZE ;
    sampleBlock = (float *) malloc( numBytes );
 
    CLEAR( sampleBlock );
 
    Pa_Initialize();
    inputParameters.device = Pa_GetDefaultInputDevice();
    inputParameters.channelCount = NUM_CHANNELS;
    inputParameters.sampleFormat = PA_SAMPLE_TYPE;
    inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultHighInputLatency ;
    inputParameters.hostApiSpecificStreamInfo = NULL;
 
    Pa_OpenStream(
        &stream,
        &inputParameters,
        0,
        SAMPLE_RATE,
        FRAMES_PER_BUFFER,
        paClipOff,
        NULL,
        NULL );
 
    Pa_StartStream( stream );
    printf("**************************************************\n");
    printf("               READING STREAM.\n");
    printf("**************************************************\n");
    fflush(stdout);
 
    while(1)
    {
        float max_sample=0;
        Pa_ReadStream( stream, sampleBlock, FRAMES_PER_BUFFER );
 
        printf("\r");
        // определяем максимальную амплитуду
        for (j=0; j<FRAMES_PER_BUFFER; ++j)
        {
            if (sampleBlock[j] > max_sample) max_sample=sampleBlock[j];
        }
        printf("Amplitude=%3.0f  \t",max_sample*100);
 
        // ***************************************
        // если аплтитуда мала, ничего не анализируем!
        if (max_sample>0.2)
        {
            // отправляем массив на БПФ, обнулив мнимую часть
            for(i=0; i<FRAMES_PER_BUFFER; i++) Im[i] = 0.0;
            FFT(sampleBlock, Im, FRAMES_PER_BUFFER, POW_2, -1);
 
            // определяем одну из двух частот с максимальным вектором
            max_ampl_1=0,max_ampl_2=0;
            max_i=0,max_i_1=0,max_i_2=0;
            for(i=15; i<FRAMES_PER_BUFFER/100; i++)
            {
                len_vector=sampleBlock[i]*sampleBlock[i]+Im[i]*Im[i];
                if (len_vector>max_ampl_1)
                {
                    max_ampl_1=len_vector;
                    max_i_1=i;
                }
            }
            // ищем второй пик
            for(i=15; i<FRAMES_PER_BUFFER/100; i++)
            {
                len_vector=sampleBlock[i]*sampleBlock[i]+Im[i]*Im[i];
                if (len_vector>max_ampl_2 && len_vector<max_ampl_1)
                {
                    max_ampl_2=len_vector;
                    max_i_2=i;
                }
            }
            if(max_i_1>max_i_2) max_i=max_i_2;
            else max_i=max_i_1;
            //printf("Freq= %f  \t",(float)max_i*SAMPLE_RATE/FRAMES_PER_BUFFER); // показывает частоту
 
            VerPar((float)max_i-1,     sampleBlock[max_i-1]*sampleBlock[max_i-1]+Im[max_i-1]*Im[max_i-1],
                   (float)max_i,   len_vector,
                   (float)max_i+1, sampleBlock[max_i+1]*sampleBlock[max_i+1]+Im[max_i+1]*Im[max_i+1]);
 
            freq_real=X0*SAMPLE_RATE/FRAMES_PER_BUFFER;
 
            // определяем номер ноты и пишем буквенное обозначение
            note_real=0;
            for (i=40; i<=83; i++)
            {
                if (freq_real>note[i].freq_down && freq_real<note[i].freq_up) note_real=i;
            }
            if (note_real>40)
            {
                // printf("FreqReal= %5.2f  \t",freq_real); // уточненная частота
                printf("Note= %s\t",note[note_real].letter);
                // печатаем отклонение в центах
                printf("delta= %f   \n", 1200 *  log2( freq_real / note[note_real].freq   ));
 
            }
        }
        else printf("\t\t\t\t\t\t");
    }
    CLEAR( sampleBlock );
    free( sampleBlock );
 
    Pa_StopStream( stream );
    Pa_Terminate();
    return 0;
}
 
int  FFT(float *Rdat, float *Idat, int N, int LogN, int Ft_Flag)
{
    // parameters error check:
    if((Rdat == NULL) || (Idat == NULL))                  return 0;
    if((N > 16384) || (N < 1))                            return 0;
    if(!NUMBER_IS_2_POW_K(N))                             return 0;
    if((LogN < 2) || (LogN > 14))                         return 0;
    if((Ft_Flag != FT_DIRECT) && (Ft_Flag != FT_INVERSE)) return 0;
 
    register int  i, j, n, k, io, ie, in, nn;
    float         ru, iu, rtp, itp, rtq, itq, rw, iw, sr;
 
    static const float Rcoef[14] =
    {
        -1.0000000000000000F,  0.0000000000000000F,  0.7071067811865475F,
        0.9238795325112867F,  0.9807852804032304F,  0.9951847266721969F,
        0.9987954562051724F,  0.9996988186962042F,  0.9999247018391445F,
        0.9999811752826011F,  0.9999952938095761F,  0.9999988234517018F,
        0.9999997058628822F,  0.9999999264657178F
    };
    static const float Icoef[14] =
    {
        0.0000000000000000F, -1.0000000000000000F, -0.7071067811865474F,
        -0.3826834323650897F, -0.1950903220161282F, -0.0980171403295606F,
        -0.0490676743274180F, -0.0245412285229122F, -0.0122715382857199F,
        -0.0061358846491544F, -0.0030679567629659F, -0.0015339801862847F,
        -0.0007669903187427F, -0.0003834951875714F
    };
 
    nn = N >> 1;
    ie = N;
    for(n=1; n<=LogN; n++)
    {
        rw = Rcoef[LogN - n];
        iw = Icoef[LogN - n];
        if(Ft_Flag == FT_INVERSE) iw = -iw;
        in = ie >> 1;
        ru = 1.0F;
        iu = 0.0F;
        for(j=0; j<in; j++)
        {
            for(i=j; i<N; i+=ie)
            {
                io       = i + in;
                rtp      = Rdat[i]  + Rdat[io];
                itp      = Idat[i]  + Idat[io];
                rtq      = Rdat[i]  - Rdat[io];
                itq      = Idat[i]  - Idat[io];
                Rdat[io] = rtq * ru - itq * iu;
                Idat[io] = itq * ru + rtq * iu;
                Rdat[i]  = rtp;
                Idat[i]  = itp;
            }
 
            sr = ru;
            ru = ru * rw - iu * iw;
            iu = iu * rw + sr * iw;
        }
 
        ie >>= 1;
    }
 
    for(j=i=1; i<N; i++)
    {
        if(i < j)
        {
            io       = i - 1;
            in       = j - 1;
            rtp      = Rdat[in];
            itp      = Idat[in];
            Rdat[in] = Rdat[io];
            Idat[in] = Idat[io];
            Rdat[io] = rtp;
            Idat[io] = itp;
        }
 
        k = nn;
 
        while(k < j)
        {
            j   = j - k;
            k >>= 1;
        }
 
        j = j + k;
    }
 
    if(Ft_Flag == FT_DIRECT) return 1;
 
    rw = 1.0F / N;
 
    for(i=0; i<N; i++)
    {
        Rdat[i] *= rw;
        Idat[i] *= rw;
    }
 
    return 1;
}
 
void VerPar(float x1,float y1,float x2,float y2,float x3,float y3)
{
    // определяем координаты вершины параболы, выводим в глобал переменные
    float A,B,C;
    A=(y3-( (x3*(y2-y1)+x2*y1-x1*y2) /  (x2-x1)))   /(x3*(x3-x1-x2)+x1*x2);
    B= (y2-y1)/(x2-x1) - A*(x1+x2);
    C= ( (x2*y1-x1*y2) / (x2-x1) )+A*x1*x2;
    X0= -(B/(2*A));
    Y0= - ( (B*B-4*A*C)  /   (4*A) );
}
Файл FreqOfNotes.с
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
# define DELTA_NOTE 49
 
struct
{
    int num;
    char letter[5];
    float freq;
    float freq_down;
    float freq_up;
} note[128];
 
void FreqOfNotes()
{
    int i;
    char *letters[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
 
    for (i=0; i<=127; i++)
    {
        note[i].num=i;
 
        strcat(note[i].letter, letters[i % 12]);
 
        if (i>=24 && i<=35) strcat (note[i].letter,"1");
        else if (i>=36 && i<=47) strcat (note[i].letter,"2");
        else if (i>=48 && i<=59) strcat (note[i].letter,"3");
        else if (i>=60 && i<=71) strcat (note[i].letter,"4");
        else if (i>=72 && i<=83) strcat (note[i].letter,"5");
        else if (i>=84 && i<=95) strcat (note[i].letter,"6");
 
        note[i].freq = 440 * pow(2,(i-69)/12.0) ;
        note[i].freq_up=note[i].freq* pow( pow (2,1/1200.), DELTA_NOTE); // смещение от ноты в центах
        note[i].freq_down=note[i].freq* pow( pow (2,1/1200.),- DELTA_NOTE); // смещение от ноты в центах
 
    }
    return ;
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.05.2013, 07:48
Помогаю со студенческими работами здесь

Как узнать частоту, амплетуду, длинну и т.д. звука в данный момент?
Здравствуйте! Как узнать частоту, амплетуду, длинну, скорость и т.д. звука в данный момент? ВОТ загрузил компонент(delphi new audio...

Как получить частоту звука?
Здравствуйте! как получить частоту звука? MediaPlayer1.FileName := 'sound.mp3'; if MediaPlayer1.Media &lt;&gt; nil then begin...

Как узнать частоту процессора?
Подскажите как узнать частоту процессора?

Как узнать частоту прцессора?
Как узнать частоту прцессора?

Как узнать начальную частоту?
собственно говоря для моей gtx 460 по сайту нвидии стандартная частота ядра 675, памяти - 1800. Так все и было, пока не зашел в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru