Если массив получен чтением из wav, то нет в нем находятся амплитуды сигнала с микрофона.
Герцы появятся только после ДПФ.
И еще нюанс.
У вас частота дискретизации 44100, если делать ДПФ на массиве размерностью меньше частоты дискретизации, то интерпретация результат немного меняется. Получается что в элементе массива результата ДПФ будет не 1 Гц, а 44100/len Гц (где len - длина массива на котором делался ДПФ).
Ну и соответственно индекс для 440 Гц будет другим.
Поэтому, возможно, проще делать ДПФ кусками по 1 сек.
Zvercheg, Видимо каждый элемент массива занимает 1 байт. Для беззнакового значения длиной 1 байт 255 - максимально возможное значение. Это значит, что у вас 8 битное АЦП.
Вообще это мало практически для всего. Для нормального звука и егообработки нужно хотя бы 2 байта, т.е. АЦП на 16 бит.
Если вы писали звук просто со звуковой карты компа, то я думаю, это можно отрегулировать настройками вашей библиотеки NAudio.
И еще. В результате ДПФ будут комплексные числа. Чтобы посчитать амплитуду нужно найти модуль комплексного числа: sqrt(Re(x)^2 + Im(x)^2)
Во второй половине массива содержится сопряжение первой половины (это свойство ДПФ). Обычно вторую половину отбрасывают, т.к. ее можно получить из первой (если понадобится сделать обратный ДПФ).
Дмитрий Королев, Ну и кроме всего прочего, а у вас указывает на константу "1001.01\0". Константа может находится в памяти только для чтения и ее именение может вызывать исключение.
Как я писал в прошлом посте вам нужно применять strcpy для копирования константы в буфер и потом работать с этим буфером.
Дмитрий Королев, Вот этим
long alen = 0 - (a - strchr(a, '\0'));
вы что хотите получить?
Длина строки вычисляется с помощью strlen(a), учтите, что strlen не учитывает последний \0 байт .
Дмитрий Королев, Будет, но вы потеряете ранее выделенный буфер. А в конце вы пытаетесь освободить уже не буфер, выделенный малоком, а константу "33". А константа хранится не в куче.
Все строковые литералы (константы) присутствуют в памяти и имеют свои адреса. Только они находятся не в куче и освободить эту память с помощью free нельзя. Но получить адрес можно.
И еще указатель - это обычная переменная, похожая на int. И строку указателю присвоить нельзя. Указателю присваивается указатель на строку.
да, для строк не memcpy, а strcpy лучше подойдет.
Но memcpy то же сделает что нужно, просто strcpy ориентировани именно на работу со строками, он определяет конец копирования по символу \0 в конце входной строки.
memcpy - более универсальная, ею можно копировать любой участок памяти, только нужно самому позаботится о том что бы передать правильный размер в функцию.
Вот так строки в Си не присваиваются:
ptr[0] = "1001.01\0";
ptr[1] = "11.1\0";
Если вам нужно эти строки скопировать в буфер, который вы выделили вызовами malloc для ptr[0] и ptr[1], то нужно использовать memcpy:
memcpy(ptr[0], "1001.01", 7 );
И в конце строковых литералов не нужно принудительно выставлять \0 - он там автоматически поставится компилятором, просто надо учитывать наличие этого 0 в конце строк.
Вот этим:
ptr[0] = "1001.01\0";
ptr[1] = "11.1\0";
вы теряете буфер, который выше выделили mallocом и потом передаете адрес константы во free, который от этого факта сходит с ума :-)
Собственно, подтвердилось мое предположение в первом посте.
Дмитрий Королев, Ошибка как минимум тут:
ptr = (char**)malloc(3);
Сразу бросилось в глаза.
С чего вы взяли, что указатель имеет размер 1 байт.
Если что в malloc передается размер в байтах памяти, которую нужно выделить.
У вас массив из трех элементов, каждый элемент имеет размер: sizeof(*ptr)
Вызов малок должен быть таким:
ptr = (char**)malloc(sizeof(*ptr) * 3);
Возможно что вы во free передаете что-то, что не было возвращено mallocом.
Возможно у вас где-то в коде выход за границы и вы перекрываете ptr чем-то другим. Потом при вызове free с не правильным указателем поведение не предсказуемо.
Recardo_Recoly, Значит создавайте его в том же потоке.
Можете создавать его непосредственно в WndProc, либо перехватывать еще и создание окна там создавать Awesomium. Тогда он будет создан в том же потоке, что и окно игры. Как-то так, имхо.
Вообще при наличии исходников проще поправить код, чем писать такой костыль с хуками. Если WndProc достаточно большая, то в своей процедуре вам нужно будет повторить весь функционал - это может быть достаточно не тривиально.
Скринов не хватает :)