Делюсь примером, написанным на python с использованием pywt, который показывает как производится фильтрация сигнала от шумов при помощи техники wavelet shrinkage.
import pywt;
import pylab;
import random;
import scipy;
#отрисовка графиков функций
def plot(data):
pylab.figure();
pylab.plot(data);
pylab.grid(True);
#число точек дискретизации
N = 65536;
#массивы чистого и зашумленного сигналов
data = scipy.ones(N,float);
ndata = scipy.ones(N,float);
#дисперсия шума
sigma = 4;
#генерируем сигнал и накладываем шум
for i in range(N):
data[i] = 10*scipy.sin(6.28*(1/float(N) + i/10e+8)*i);
ndata[i] = data[i] + random.gauss(0,sigma);
#знаходим максимальный уровень разложения
w = pywt.Wavelet('sym20');
dec_level = pywt.dwt_max_level(N, w.dec_len);
#находим коэффициенты разложения для макисмального уровня
coeffs = pywt.wavedec(ndata, 'sym20', 'zpd', dec_level);
#зная шумовую дисперсию вычисляем treshold-level
tr_level = sigma*scipy.sqrt(2*scipy.log(N));
print tr_level;
#tresholding
for i in range(dec_level):
tcoeffs = pywt.tresholding.soft(coeffs[i+1], tr_level);
coeffs[i+1]=tcoeffs;
#обратное преобразование - получаем очищенный сигнал
rdata = pywt.waverec(coeffs, 'sym20', 'zpd');
#рисуем графики
plot(data);
plot(ndata);
plot(rdata);
pylab.show();




Спасибо автору за наглядный пример! До меня идея вейвлет доходит с трудом: я пока лишь провожу параллели с преобразованием фурье.. Но фильтр на основе вейвлет-преобразований меня привлекают больше, чем на основе БПФ. Теперь мне легче стартовать на рабочем примере! Спасибо ;-)
ОтветитьУдалитьТакже в 40 строке опечатка
С 40й строкой как я помню, есть один забавный момент. Thresholding и tresholding. Варианты написания для pywt под linux и win отличаются ) данный пример уже не помню в какой ОС работает
ОтветитьУдалить