تکرار م?شود، ولي تعداد محاسبات نصف م?شود، چرا که اين بار الگوريتم فقط بر روي يک دوم اول آرايه دوم اجرا م?شود يعني مقاديري که از حاصل جمع دو داده همسايه بدست آمده اند.
6
2
10
6
5
3
7
9

-2
-2
-1
1
4
8
4
8

-2
-2
-1
1
2
2
6
6

-2
-2
-1
1
2
2
0
6

عملکرد يک تابع تبديل ويولت با مثال بالا کاملاً به وضوح ديده م?شود. در مثال بالا آرايه داراي طول 8 است و تا سه سطح تبديل ويولت اعمال شده است. اين تعداد سطح براي اين طول آرايه حداکثر مقدار است، ولي عموماً اگر آرايه با طول بزرگتر هم داشته باشيم بيشتر از سه سطح تبديل ويولت اعمال نمىشود. و اما پياده سازي الگوريتم تبديل ويولت به صورت رياضي با کمک فيلترهاي بالا گذر و پايين گذر حاصل م?شود. اين دو فيلتر در تبديل ويولت معکوس هم استفاده م?شوند و با هم تشکيل فيلترهاي آينه اي متعامد، که معمولاً به صورت يک آرايه پياده م?شود، را مي دهند. در مثال بالا و در انتهاي عمليات تبديل ويولت عدد اول به عنوان تقريبي از کل سيگنال و 7 عدد ديگر به عنوان بخش جزئيات اين تبديل مي باشند که براي عمليات دادهکاوي بخش جزئيات در نظر گرفته مىشود.
در کد آندرويد زير ابتدا سيگنال اصلي در يک آرايه موقت ذخيره م?شود. در گام بعدي با توجه به مقدار متغيير L که تعداد سطوح تبديل ويولت را نشان مـ?دهد، تعداد تکرار الگوريتم در متغيير iterations مشخص م?شود. در مرحله بعدي ابتدا فيلتر پايين گذر از روي مقادير پيش فرض ساخته شده و در ادامه فيلتر بالا گذر از روي فيلتر پايين گذر بدست م?آيد. سپس با کمک اين دو فيلتر، آرايه فيلتر آينه اي متعامد حاصل م?شود که در الگوريتم با متغيير QMF مشخص شده است. در مرحله آخر فيلتر آينه اي متعامد در سيگنال اصلي ضرب شده و حاصل آن تبديل ويولت سيگنال خواهد بود.
public static double[] forwardDwt(double[] signal, int L) throws Exception {
int n = signal.length;
double[] dWT = MatrixOps.deepCopy(signal);
int log2n = (int) (Math.log(n) / Math.log(2));
int iterations = log2n – L;
int subLength = n;
double[] H = OrthogonalFilters.getLowPass();
double[] G = OrthogonalFilters.getHighPass(H);
for (int i = 0; i < iterations; i++) {
subLength = n / (int) (Math.pow(2, i));
double[][] QMF = makeQMFMatrix(subLength, H, G);
double[] subResult = new double[subLength];
subResult = subCopy(dWT, subResult, subLength);
double[] temp = MatrixOps.multiply(QMF, subResult);
dWT = subCopy(temp, dWT, subLength);
}
return dWT;
}
براي بدست آوردن تبديل ويولت يک سيگنال، يک سري توابع مادر ويولت وجود دارند که از لحاظ رياضي درستي عملکرد آنها اثبات شده است و ما هم در اينجا قصد بررسي تک تک آنها را نداريم و جداي از پيچيدگي هر يک از آنها م?توان گفت که تا حدودي م?توان عملکرد مشابهي را از تمام انواع ويولت مادر انتظار داشت، و اما ويولت مادري که در اين پروژه استفاده شده است اولين ويولت مادر و سادهترين نوع آن م?باشد که براي محدوديت هاي کاري ما کاملاً مناسب است. ويولت مادر در اين پروژه از نوع Haar م?باشد. در ادامه توليد فيلتر آينه اي متعامد توسط اين الگوريتم تشريح م?شود.

شکل 4-19: ويولت مادر Haar

همانطور که در شکل 4-19 مي بينيد، براي بدست آوردن فيلتر آينه اي متعامد در تبديل ويولت Haar تنها دو مقدار برابر و معکوس کافي است. اين فيلتر براي اين نوع ويولت معمولاً برابر 1 و -1 است، اما در کارهاي عملي معمولاً عددي نزديک به 0.7 و -0.7 انتخاب م?شود. در کد زير ابتدا فيلتر پايين گذر از روي همين مقدار پيش فرض بدست آمده و در گام بعدي از روي فيلتر پايين گذر، فيلتر بالا گذر ساخته م?شود.
static double[] getLowPass() {
double[] H = {.707106781186547,.707106781186547 };
return H;
}

public static double[] getHighPass(double[] H) {
double sign = -1;
int n = H.length;
double[] G = new double[n];
for (int i = 0; i < n; i++) {
G[n – i – 1] = H[i] * sign;
sign *= -1;
}
return G;
}
فيلتر آينه اي متعامد هم با قرار دادن دو فيلتر حاصل از مرحله قبل به صورت زير محاسبه م?شود.
private static double[][] makeQMFMatrix(int scale, double[] H, double[] G) {
int filterLen = H.length;
int skip = 0;
double[][] QMF = new double[scale][scale];
for (int i = 0; i < (scale / 2); i++) {
for (int j = 0; j < filterLen; j++) {
int location = j + skip;
if (location > scale – 1)// wrap
{
location = location – (scale);
}
QMF[i][location] = H[j];
}
skip += 2;
}
skip = scale – 1;
for (int i = scale – 1; i >= (scale / 2); i–) {
for (int j = filterLen – 1; j >= 0; j–) {
int location = -j + skip;
if (location < 0) {
location += scale;
}
QMF[i][location] = G[filterLen – j – 1];
}
skip -= 2;


دیدگاهتان را بنویسید