В этой статье описывается алгоритм вариации Фурье, реализованный в Java. Поделитесь этим для вашей ссылки, следующим образом:
Результат вариации Фурье используется для реализации Java в качестве формы множественного числа A+BI
Без лишних слов, код реализации выглядит следующим образом, в общей сложности два класса
FFT.Class Fourier Function Function Code Code
Пакет fft.test;/********************************************************************************************************* • Реализация голой костей *, которая работает во время O (n log n). Наша цель - оптимизировать * ясность кода, а не производительность. * * Ограничения ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ******************************************************************* • // базовый случай if (n == 1) вернуть новый комплекс [] {x [0]}; // RADIX 2 COOLEY-TUKEY FFT if (n % 2! = 0) {бросить новое Runtimeexception ("n не является силой 2"); } // fft of estore -terms complex [] evel = new Complex [n / 2]; for (int k = 0; k <n / 2; k ++) {даже [k] = x [2 * k]; } Комплекс [] Q = FFT (даже); // FFT OF OF OD SODCE COMPLEST [] ODD = EVER; // повторно использовать массив для (int k = 0; k <n / 2; k ++) {add [k] = x [2 * k+1]; } Комплекс [] r = fft (ODD); // объединить комплекс [] y = новый комплекс [n]; for (int k = 0; k <n / 2; k ++) {double kth = -2 * k * math.pi / n; Комплекс WK = новый комплекс (Math.Cos (kth), Math.Sin (KTH)); y [k] = q [k] .plus (wk.times (r [k])); y [k + n / 2] = q [k] .minus (wk.times (r [k])); } return y; } // Вычислить обратный FFT x [], если предположить, что его длина является силой 2 общественного статического комплекса [] ifft (комплекс [] x) {int n = x.length; Сложный [] y = новый комплекс [n]; // принимайте конъюгат для (int i = 0; i <n; i ++) {y [i] = x [i] .conjugate (); } // Вычислить вперед FFT y = FFT (y); // снова принять конъюгат для (int i = 0; i <n; i ++) {y [i] = y [i] .conjugate (); } // делить на n для (int i = 0; i <n; i ++) {y [i] = y [i] .scale (1,0 / n); } return y; } // Вычисление круговой сверты с общедоступным статическим комплексом x и y [] cconvolve (Complex [] x, Complex [] y) {//, вероятно, должен Pad x и y с 0s, чтобы они имели одинаковую длину // и являются полномочиями 2 if (x. } int n = x.length; // Вычислить FFT каждой последовательности, оценить комплекс [] a = FFT (x); Комплекс [] b = FFT (y); // точечное умножение, комплекс умножения точки [] c = новый комплекс [n]; for (int i = 0; i <n; i ++) {c [i] = a [i] .times (b [i]); } // Вычислить обратный FFT, returpolation return iffft (c); } // Вычислить линейную свертку публичного статического комплекса x и y [] convolel (комплекс [] x, комплекс [] y) {комплекс Zero = новый комплекс (0, 0); Комплекс [] a = новый комплекс [2 * x.length]; // 2n раз границы раз, коэффициент высшего порядка составляет 0. Для (int i = 0; i <x.length; i ++) a [i] = x [i]; for (int i = x.length; i <2 * x.length; i ++) a [i] = Zero; Комплекс [] b = новый комплекс [2 * y.length]; for (int i = 0; i <y.length; i ++) b [i] = y [i]; for (int i = y.length; i <2 * y.length; i ++) b [i] = Zero; вернуть cconvolve (a, b); } // Отображение массива комплексных чисел в стандартном выходе Public Static void Show (Complex [] x, String Title) {System.out.println (title); System.out.println ("-----------------------------------------"); int complexlength = x.length; for (int i = 0; i <complexlength; i ++) {// Выходной комплекс // system.out.println (x [i]); // Выходная амплитуда требует * 2 / длины System.out.println (x [i] .abs () * 2 / complexlength); } System.out.println (); }/ ** * Реорганизовать данные массива в мощность 2 вывода * * @param data * @return */ public static double [] pow2doublearr (double [] data) {// Создать новый массив Double [] newdata = null; int dataLength = data.length; int sumnum = 2; while (sumnum <datalength) {sumnum = sumnum * 2; } int addlength = sumnum - dataLength; if (addlength! = 0) {newdata = new Double [sumnum]; System.ArrayCopy (Data, 0, Newdata, 0, DataLength); for (int i = dataLength; i <sumnum; i ++) {newdata [i] = 0d; }} else {newdata = data; } вернуть newdata; } /** * deoffset * * @param OriginalArr * OriginalArr * OriginalArr * Public Static Double [] deskew (Double [] OriginalArR) {// Фильтр неверные параметры if (OriginARR == null || OriginAr.Length <= 0) {return null; } // Определите целевой массив Double [] Resarr = new Double [OriginalArr.length]; // найти сумму двойной суммы массива = 0d; for (int i = 0; i <OriginalArr.length; i ++) {sum+= OriginalArr [i]; } // Найти среднее значение массива Double aver = sum / OriginalArr.length; // Удалить значение смещения для (int i = 0; i <OriginalArr.length; i ++) {resarr [i] = OriginalArR [i] - aver; } return resarr; } public static void main (string [] args) {// int n = integer.parseint (args [0]); Double[] data = { -0.35668879080953375, -0.6118094913035987, 0.8534269560320435, -0.6699697478438837, 0.35425500561437717, 0.8910250650549392, -0.025718699518642918, 0,07649691490732002}; // Удалить смещение данных = deskew (data); // мощность числа 2 = pow2doublearr (data); int n = data.length; System.out.println (n + "номер в массиве n ..."); Сложный [] x = новый комплекс [n]; // исходные данные для (int i = 0; i <n; i ++) {// x [i] = новый комплекс (-2 * math.random ()+1, 0); x [i] = новый комплекс (данные [i], 0); } show (x, "x"); // FFT исходного комплекса данных [] y = FFT (x); show (y, "y = fft (x)"); // принимать обратный комплекс FFT [] z = ifft (y); show (z, "z = ifft (y)"); // Круглая свертка x с самим комплексом [] c = cconvolve (x, x); show (c, "c = cconvolve (x, x)"); // линейная свертка x с самим сложным [] d = convolve (x, x); show (d, "d = couplove (x, x)"); }}/***************************************************** ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0,35425500561437717 0,8910250650549392 * -0,025718699518642918 0,07649691490732002 * * y = FFT (x) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2.4696418005143532I 1.1395317305034673 * -0,17611092978237974 -2,4696418005143532I -0,8301420417085572 + * 0,876884068792042I -1,2457766630654419 - 0,7113504894129803i * * z = ifft (y) -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0,8534269560320435 -2,691607282636124E -17I * -0,6699697478438837 + 4,1114763914420734E -17I 0,3542555005614377717 * 0,891501505549393939393939392555005614377717 * 0,89150150549393939393939393939393939393925555614377717 * 0,891506505493939393939393925555614377717 * 0,8915015054939393939393939392555005614377717 6.887033953004965E-17I -0.025718699518642918 + * 2,691607282636124E-17I 0,07649691490732002-1,4396387316837096E-13 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1.9986455722517509E-16I 1.432390480003344 + 2,636779683484747E-16I * -2,2165857430333684 + 2,2180047699856214E-17I -0,01255256666669569856214E -17I -0,012552566666669569856214E -17I -0,01255256666669569856214E -17I -0,0125525666669569856214E-17 1.3815636262919812E-17I 1.0230680492494633-2.44422465262488753E-16I * * D = COUPLEPLE (X, X) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0,43645117531775324 -2,78776395788635E -18I * -0,2345048043334932 -6,907818131459906E -18I -0,566328025196803 + * 5,829899189189189418918918914189141891418914189e14189e14189e141891414189e149 1.2954076913348198 + 1.518836016779236E -16I * -2,212650940696159 + 1,1090023849928107E -17I -0,0184070346878577718 -*11377766666666666666666666666666666666666666666666666666666666666666E -106666666666666666666666666666666666666666666666666666ER866666666666666666666666666666666666666666666ERI -1 1.023068049249463 -9.435675069681485E -17I * -1,205924207390114 -2,983724378680108E -166,796330738580325 + * 2,496781157742562562E -17I -17I -17I -17I -17I -17I -17I -17I17I -17I17I17I -17 0.6732024728888314 - 6.907818131459906E-18i * 0.00836681821649593 + 1.4156564203603091E-16i 0.1369827886685242 + * 1.1179436667055108E-16i -0.00393480233720922 + 1,1090023849928107E-17I * 0,005851777990337828 + 2,51241462921638E-17I 1,1102230246251565E -16-1,498679192888.119288.1119288.19288019288.192888.111192888E-126565E-16-1,498679192888E-12651565. *************************************************Комплекс. Класс Класс множества
Пакет fft.test;/********************************************* * * Тип данных «неизменен», поэтому, как только вы создаете и инициализируете * сложный объект, вы не можете его изменить. Ключевое слово «окончательное» при объявлении Re и IM обеспечивает это правило, что делает его * ошибкой времени компиляции, чтобы изменить переменные экземпляра .re или .im после * они были инициализированы. * * % Java Complex * a = 5,0 + 6,0i * b = -3,0 + 4.0i * re (a) = 5,0 * im (a) = 6,0 * b + a = 2,0 + 10,0i * a - b = 8,0 + 2,0i * a * b = -39,0 + 2,0i * a /b = 0,36 - 1,52i * (a /b) * b = 5.0 + 6.0 + 6.0 + 6.0 + 6.0 + 6.0 + 6.0 + 6.0 + 6.0. | = 7,810249675906654 * tan (a) = -6,685231390246571e -6 + 1,0000103108981198i * ************************************************************* • Частный окончательный двойной Dou; // Реальная часть частного финального двойного двойного IM; // Воображение Часть // Создать новый объект с данным реальным и представлять Parts Public Complex (двойное реальное, двойное изображение) {re = Real; im = представить; } // возвращать строковое представление вызового комплекса объекта public String toString () {if (im == 0) return re + ""; if (re == 0) вернуть im + "i"; if (im <0) вернуть re + " -" + (-im) + "i"; вернуть re + " +" + " + im +" i ";} // возвращать Abs/modulus/magnity public double abs () {return math.hypot (re, im);} // Угол возврата/Фаза/Аргумент, нормализованный между -pi и pi public Double Fash () {return Math.Atan2 (im, re);} // return return aember -комплекс, комплекс, плюс, плюс, плюс, плюс (плюс, плюс (плюс, плюс (плюс. это ;/ Вызов объект Double = A.RE + B.RE; {Комплекс A = Double Real = A.Re * B.Re - A.Im * B.Im; {вернуть новый комплекс (re, -im); {Комплекс A = This; Комплекс (math.sin (re) * math.cosh (im), math.cos (re) * math.sinh (im)); Этот общедоступный комплекс () {return sin (). ! x.getClass ()) вернуть ложь; Комплекс (-3.0, 4.0); System.out.println ("a - b =" + a.minus (b)); A.Divides (b) .times (b));Для получения дополнительной информации об алгоритмах Java, читатели, которые заинтересованы в этом сайте, могут просмотреть темы: «Учебное пособие по структуре данных Java и алгоритм», «Сводка операции Java Dom Node», «Сводка Java File и каталог
Я надеюсь, что эта статья будет полезна для всех Java Programming.