Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вейвлет-преобразование
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Математика и Физика
Cosworth
Добрый день. Разбираюсь с ДВП, для проверки написал программку в матлабе. Вейвлет - CDF(5,3), коэффициенты для LP: [-1/8, 1/4, 3/4, 1/4, -1/8], для HP: [0, -1/2, 1, -1/2, 0]. Код:
Код
function [lo, hi] = cdf_5_3(ai)
    lo = zeros(1, length(ai)/2);
    hi = zeros(1, length(ai)/2);
    k = 1;
    a = 6/8;
    b = 2/8;
    c = -1/8;
    d = 1;
    e = -1/2;
    for i = 1:2:length(ai)-4
        x(1) = ai(i);
        x(2) = ai(i + 1);
        x(3) = ai(i + 2);
        x(4) = ai(i + 3);
        x(5) = ai(i + 4);
        lo(k) = int8(a*x(3) + b*(x(2) + x(4)) + c*(x(1) + x(5)));
        hi(k) = int8(d*x(3) + e*(x(2) + x(4)));
        k = k + 1;
    end
end

Не могу понять почему, после преобразованиия получается лажа:

Слева на право: Оригинал, моя функция, матлабовская функция dwt2 (Вейвлет - Дабоши 2).
Cosworth
Стою я летом в лыжи обутый... cranky.gif Отлаживаюсь м матлабе по шагам:
x(1) = 155
x(2) = 155
x(3) = 155
x(4) = 154
x(5) = 155
Считаю lo(1) на бамажке: lo(1) = x(3)*(3/4) + (x(2) + x(4))*(1/4) - (x(1) + x(5))*(1/8) = 154.75
Матлаб рисует 64 wacko.gif
_Ivana
Тоже обул лыжи, вышел а Матлаб, посмотрел...
Код
x = 155.*ones(1, 10);
lo1 =  int8(x(3)*(3/4) + (x(2) + x(4))*(1/4) - (x(1) + x(5))*(1/8))
lo2 = uint8(x(3)*(3/4) + (x(2) + x(4))*(1/4) - (x(1) + x(5))*(1/8))
Cosworth
уинт работает правильно, но поменял в функции - те же вилы blink.gif
В воркспейсе массив вообще обозначен как дабл.

Все, кажись разобрался. x(1) = 155, 6*x(1)/8 = 32 - ошибка из-за переполнения int8, а вот 6*(x(1)/8) = 144. Вот за это не люблю матлаб - строгой типизации нету, зато есть грабли с ней связанные.
fowler
В MATLAB есть функция intwarning.
Включите вывод сообщений с помощью intwarning('on') и MATLAB будет выдавать предупреждения при переполнении.
Cosworth
Спрошу тут, чтобы темы не плодить. Вот есть у меня переменная uint8. В матлабе по умолчанию используется режим насыщения при переполнении (т.е 200+100=255). Можно ли какими настройками сделать по-человечески чтобы 200+100=44 ?
fowler
Сдается мне, что в актуальных версиях MATLAB таких настроек нет. Если по человечески - надо переопределять функции класса uint8 и учитывать при операциях возможность переполнения (т.е. после сложения двух целых берем по модулю 256 (функция mod)).
Для типов, кратных 16-битному слову - можно использовать 'fixed-point toolbox'. В help смотреть функции fi и ufi.

И еще, прощу прощения, но я ошибся. Попробовал на работе - в текущих версиях MATLAB уже нет функции intwarning.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.