Виды являются довольно потрясающими, когда Вы не полностью доверяете сторону, отправляющую запросы в Вашу базу данных. Хороший пример мог бы быть Вами, создаст представление о таблицах для подрядчика так, чтобы все, что они видят, было строками, имеющими отношение к их проекту.
На самом деле основная проблема не в вашем коде, а в ваших рассуждениях.
Итак, мы можем решить это уравнение:
64 * x = 674.208
и получить примерно 10.5.
Пока все хорошо. (На самом деле 674,208 должно быть 674,246, но это потому, что вы округлили 65,41 до 4 значащих цифр ранее.)
Таким образом, сигнал необходимо воспроизводить на 10,5% от его исходной скорости.
Нет! Сигнал должен быть замедлен в 10,5 раза. Это означает, что в нее нужно играть со скоростью 1 / 10,5 = 0,095
или 9,5% от исходной скорости.
Приведение (int) smp_index
не вызывает проблему. Он просто растягивает волну - это потеря качества (возможно, ваши волновые данные должны быть длиннее 64 отсчетов), но не может изменить частоту. Скорее всего, проблема в том, что:
if(smp_index > realLength)
smp_index = 0;
должно быть:
if(smp_index >= realLength)
smp_index -= realLength;
У меня есть еще несколько примечаний для вас:
частота = частота дискретизации / длительность сигнала в сэмплах
Мм, если под «длительностью сигнала» вы имеете в виду период волны, то да. Т.е. если ваш 64-образный сигнал представляет собой синусоидальную волну с периодом 64, тогда да. Если 32 или 16, то все будет иначе. Если это что-то, что не делит 64 (например, 48 или 30), тогда ваша форма волны в первую очередь не периодическая.
Теперь:
u32 waveform_length;
out = (s8*) buf;
if(smp_index < waveform_length){
What ' s значение waveform_length
? По-моему, неинициализированный ...