Айфичер Э., Джервис Б. Цифровая обработка сигналов, практический подход (2-е изд., 2004) (1095888), страница 37
Текст из файла (страница 37)
Мйф ер, З1.10.91 /« /* о1С МУГ() ( ехсегп 1пс 1п»з ехгегп 1опр пргз 1опд )с, и; с)очЫе ММ, иК, с, а, ХР[в1яе], Х1[в1яе]; ехсегп соир1ех х[я1ге]; ММ-г*р1/прс; 11(1пч 1) ММ=-ММ; гог(К-Озг<през++К)[ ХМ[К) 0.0; Х1[К] 0.0з /* Программа для прямого вычисления /* используются 3 другие функции /* /* 3.
Лйфичер, ипль 1992 года /» / *------- во времени «/ */ */ */ */ «/ Приложения 197 н)с )с*низ бог(п О;п<прх;++и)( с сов(п»нк)зз=з1п(п»н)с)з ХВ[)с] Хй[Х]+к[о+1].геа1»с+к[в+1].1ыас»вз Х1[Х]-Х1[)с]-к[о+1] . геа1»з+х[п+1],1пад»сз ) 11(1пч 1)( /* разделить на М для ОДПФ */ ХП[Х]-ХН[)с)/прт.; Х1 [Х] Х1 [Х] /прт.; ) гог()с 1сй<=прс;+»Х)( /» сохранить преобразованные данные в х "/ х(Х].геа1 ХК[Х-1]з х[К] .1 д Х1(Х-1]; Программа ЗА.Э. Функция для чтения данных, функция для записи преобразованных данных в файл на диске, заголовочный файл, содержащий постоянные структурные определения, и заголовочный файл, содержащий общие объявления и переменные чо1с( геас( с(аха() ехсегп 1опс прс; 1пг и; ехсегп совр1ех х[з1ге); 1ог(п=о;п<з1ге;++и]( х [ п] . геа1=0; х[п].1иад О; 11((1п Гореп("соегг.с(ах","г"))= ИП)1)( рг1псг("невоэмовно открыть файл соегг.с(ас1п")( ех1Г(1); ) Евсапт(1п,"$1с(»,апре)з бог(п=1зп< прг;++и)( тзсапт(1п,$11%11",ях(п].геа1,ах[о].1ыад)с ) 1с1озе(1п)с тозс) ( вате с(аса() /*имя файла зс(ага.с */ 1опс Уы 1пх К1з ехгегп 1опс прг; /* Функция для /* /* 3.
Лйфичер, /* /*-- чтения данных в комплексном формате для ДПФ илн БПФ */ */ */ */ 198 Глава 3. Дискретные преобразования ехкекп соир1ех х[в1хе]; 1т((оие горел("бйкоит.бак","и")) НцЬЬ)( рк1пкт("невозможно открыть файл бтеоие.бак1п"); ех1С(1) т трк1птк (оис, ")тМХИ()с) М1СХ1 ()т) 1п" ); крк1пкт(оит,"1п"); ток(К=1;К< прк;++)т)( )т1 )т-1; урттпкк(оик,"Ьб,ткееткьу1п", К1,х[)т).кеа1,х[К].1вао); ) тс1ове(оик); ) /" этот файл содержит общие объявления и структуры.
«/ 41пс1ибе <вкбто. Ь> 41пс1ибе <насп.п> 41пс1ибе <бов.п> ебет1пе в1хе 600 йбектпе р1 3.141592654 йбек1пе щахЬ1кв 30 суребек вт тисе ( боиЬ1е кеа1; боиЫе 1шасн боиЫе щоби1ив; боиЫе апд1е; )сощр1ех; /* имя файла: бкт.п */ чотб бЕС()к чо1б ккк() к чо1б кеа1 баса(); чотб ваче баТа(); 1пе 1пч; 1опд прет сощр1ех х[в1ке); Р1ЬЕ *1п, «оис, «<преп()к Пример ЗАЛ Воспользуйтесь программой прямого вычисления ДПФ и найдите коэффициенты следуюп(ей восьмнточечной дискретной во времени последовательности: х(л) = [4,2,1,4,6,3,5,2/ Приложения 199 Файл входных данных, созданный для этой задачи с помощью ПК программы ед11п (для этой цели можно использовать и другие текстовые процессоры), имеет следующий вид; 8 4 0 2 0 1 0 4 0 6 0 3 0 5 0 2 0 В первой строке задается длина последовательности данных.
ДПФ данных, полученное с помощью приведенной выше программы, имеет такой вид: й ХВ(й) Х1(1) 0 27, 000000 О, 000000 1 -4, 121320 3, 292893 2 4, 000000 1, 000000 3 0,121320 -4,707107 4 5, 000000 -О, 000000 5 0,121320 4,707107 6 4, 000000 — 1, 000000 7 -4, 121320 -3, 292893 С помощью программы вычисления ДПФ найдите дискретную во времени последовательность, соответствующую приведенным выше коэффициентам ДПФ. Входные данные имеют следующий вид: 8 27, 000000 О, 000000 -4, 121320 3, 292893 4, 000000 1, 000000 0,121320 -4,707107 5, 000000 -О, 000000 О, 121320 4, 707107 4, 000000 -1, 000000 -4, 121320 -3, 292893 Используя программу, получаем на выходе последовательность, идентичную дискретной последовательности в примере ЗА.1. 200 Глава 3.
Дискретные преобразования Таблица ЗА.1. Входная последовательность ьомллексных чисел Дсйстантсаьнан часть натан часть НриФ~ер $~13-. В третьем примере используется последовательность комплексных чисел из работы 11ЕЕЕ, 1979]: х(п) = Я", и = О, 1,..., 31, где Я =0,9+10,3. Входная последовательность данных х(п) и ее ДПФ Х(1с), полученное с помощью программы прямого вычисления ДПФ, приведены в табл. ЗА.1 и ЗА.2 соответственно.
0 1 2 3 4 5 б 7 В 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 О, 100000Е01 О, 900000ЕОО О, 720000ЕОО О, 4860ООЕОО О, 2268ООЕГй — О, 29! 600ЕО1 -О, 256608ЕОО -О, 435650ЕОО -О, 55 3224ЕОО -0,603717ЕОО -О, 588789ЕОО -О, 516476ЕОО -О, 399746ЕОО -О, 254714ЕОΠ— О, 987144 Е-01 О, 515569ЕО1 О, 181645ЕОО О, 280560Егй О, 34152ВЕОО О, 362246ЕОО О, 344667ЕОО О, 294380ЕОО О, 219684ЕОО О, 130488ЕОО О, 371637Е-01 -О, 50544ОЕ-01 -О, 124428ЕОΠ— О, 178480ЕОО -О, 209279ЕОО -О, 2160 70ЕОО -О, 20й575ЕОО -О, 166572ЕОО 0,0 О, 3 ОГЯКЯЕОО О, 540000ЕОО О, 702000ЕОО О, 7770йЕОО О, 767880ЕОО О, 682344ЕОО 0,537127ЕОО 0,352719ЕОО О, 151480ЕОО -О, 447828Е-01 -О, 216941ЕОО -О, 350190ЕОО -0 435095ЕОΠ— О, 467999 ЕОО -О, 450814 ЕОО -О, 390265ЕОО -О, 296745 ЕОО -О, 182903ЕОО -О, 621539Е-01 0,527352Е-01 О, 150862ЕОО О, 224090ЕОО О, 267586ЕОО О, 279974ЕОО О, 263125ЕОО 0,221649ЕОО О, 162156 ЕОО О, 923965 Е-01 0,203732Е-01 -О, 4648 Ы Е-01 -О, 102009ЕОО Приложения 204 Таблица ЗА.2.
Преобразованный выход (пример ЗА.2) З..ез';=",",: Программа на С для двоичного БПФ с временной децимацией Приведенная ниже программа вычисления БПФ представляет собой реализацию на С двоичного БПФ с временной децимацией 19). Программа вычисляет ДПФ и ОДПФ дискретной во времени последовательности согласно определению (ЗА.!). Программа состоит из главной функции г(тст'. с и трех фунюзий: хек() „хеас( баса() и ваче дала ( ) . Как и при вычислении непосредственно ДПФ, все функции записаны в отдельных файлах и обьединяются при компиляции с помощью вызова (1пс1цйе) из главной функции.
Функции геас( с(аса() и ваче с(аса() используются для чтения данных и записи преобразованных данных в файл. Эти два файла идентичны файлам, которые применялись для прямого вычисления ДПФ. Главная программа дхсх . с и функция йх с ( ] приведены в программах ЗБ1 и ЗБ2 соответственно. 0,693972 2,792268 9,402964 1, 866446 1,131822 0,904794 0,799557 О, 739607 О, 700858 О, 673577 0,653112 0,636987 0,623790 0,612613 0,602885 О, 594200 0,586276 0,578899 О, 571898 0,565139 0,558490 0,551858 0,545134 0,538217 0,531000 0,523403 0,515361 О,506928 О, 498469 0,491388 О, 490730 О, Ы7355 3,499714 8, 050456 -9, 135013 -3, 833833 -2, 234158 -1, 534631 -1, 139607 -О, 882315 -О, 698566 -О, 558478 -О, 446244 -О, 352691 -О, 272085 -О, 200642 -О, 135703 -0,075314 -О, 017948 0,037651 О, 092607 0,147983 О, 204882 О, 264523 О, 328363 0,398257 0,476679 0,567133 0,674850 О, 808100 О, 980906 1,219210 1, 577083 2, 188832 2б2 Глава 3.
Дискретные преобразования Использование любого из примеров, приведенных в приложении ЗА, с программой для вычисления БПФ дает такие же результаты, что и с программой для прямого вычисления ДПФ. Доказать зто утверждение предлагается читателям в качестве самостоятельного упражнения. Программа ЗБ.). Главная функция дйбс для вычисления ДПФ с помощью БПФ с временной децимацией ДПФ с помощью БПФ с ВД */ */ */ */ я/ "бврз.н" "с ге.ь" $1пс1чбе 91пс1ибе та1п() ( екеегп 1опд прес ехеегп 1пе 1пч; рг1пет("выберите тип преобраэования1п"); рг1пСГ("1п")з рг1пет("О для прямого ДПФ1п") з рг1пкс("1 для обратного ДПФМ"); асапт("Ьб",ь1пч)з геас( с(аСа(); гге()з ваче баев()з ех1С(); ) $1пс1чс)е 91пс1ибе 91пс1сс(е "ггс.с"з "гбаеа.с"г "апаса.с"з Программа ЗБ.2.
Реализация на С двоичного алгоритма БПФ с временной децимацией /* Программа для вычисления коэффициентов /* испольэуются 3 другие функции /* /* Э. Лйфичер, июль 1992 года /* /а имя файла: Гтс.с /* /* Э. ййфичер, июль 1992 года /* /* функция вычисляет ДПФ последовательности /* помощью двоичного БПФ / я чо1с( ГГЕ() 1пе в1дп; 1опд и,1кеи,1,1е,1е1,)с,1р,1,5з */ «/ е/ */ с */ */ */ Приложения с(оиЫе иг,и1,мг,и1,сг,с1,севрс ехсегп 1опс прис ехсегп совр1ех х[в1ге); /* перестановка с замещением данных, определяемая обратным порядком битов */ ]=1; гог(1=1;1<прис++1) 1й(1<]) ( Гг=х [] ] . геа1; Г1=х [] ] . 1ваБ; х [2] . геа1=х [ 1) .
геа1; х[]] .1вас х[1] .1васс к[1] . геа1=сг;х[1].1вас Г1; и прс/2; ы)с11е()с<5) ( ]=] — )с; )с=)с/2; ) е1ве( )с=при/2с ып11е ( )с<] ) ( ]=]-хс )с=к/2; ) /* считается количество каскадов: в=1ос2(прс) и выби) либо ОБПФ */ в О;1гев=прсс нП11е(1гев>1) ( 1гев=1гев/2; в=в+ 1; ) 11(1пч 1) в1дп=1с е1ве в1чп -1; /* вычисляется БПФ для каждого каскада*/ гог(1 1с1< в 'н1) 1е=рои(2,1); 1е1=1е/2; иг 1.0; и1 О; нг сов(р1/1е1)с ы1 в1сп*в1п(р1/1е1); Гог(]=1;]<=1е1с++5) ( 1 3; и)с11е(1< при)( 1р=г+1е1; Гг х[1р] . геа1*иг-х [1р] . 1вад*и1с г1=х[1р].1вад*иг+х[1р].геа1аи1; Глава 3.