1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792 |
- <?xml version='1.0' encoding='iso-8859-1'?>
- <!doctype html public '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
- <html xmlns='http://www.w3c.org/1999/xhtml' lang='en-us'>
- <head>
- <title>
- psnotch.c
- </title>
- <meta http-equiv='content-type' content='text/html;iso-8859-1'/>
- <meta name='generator' content='motley-tools 1.9.4 13:40:33 Feb 18 2015'/>
- <meta name='author' content='cmaier@cmassoc.net'/>
- <meta name='robots' content='noindex,nofollow'/>
- <link href='toolkit.css' rel='stylesheet' type='text/css'/>
- </head>
- <body>
- <div class='headerlink'>
- [<a href='pskey.c.html' title=' pskey.c '>PREV</a>]
- [<a href='toolkit.html' title=' Index '>HOME</a>]
- [<a href='psout.c.html' title=' psout.c '>NEXT</a>]
- </div>
- <pre>
- /*====================================================================*
- *
- * Copyright (c) 2013 Qualcomm Atheros, Inc.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted (subject to the limitations
- * in the disclaimer below) provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * * Neither the name of Qualcomm Atheros nor the names of
- * its contributors may be used to endorse or promote products
- * derived from this software without specific prior written
- * permission.
- *
- * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
- * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE
- * COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *--------------------------------------------------------------------*/
- /*====================================================================r
- *
- * psnotch.c - Atheros Prescaler Notching Utility
- *
- * Atheros Powerline Toolkit;
- *
- * this program is the Atheros INT6000 Dynamic Notching Utility
- *
- * this program inspects the following frequency bands for SW signals:
- *
- * 120 m 2,300 - 2,495 kHz tropic band
- * 90 m 3,200 - 3,400 kHz tropic band
- * 75 m 3,900 - 4,000 kHz shared with the amateur radio 75/80 meter band
- * 60 m 4,750 - 5,060 kHz tropic band
- * 49 m 5,900 - 6,200 kHz
- * 40 m/41m 7,100 - 7,350 kHz shared with the amateur radio 40 meter band
- * 31 m 9,400 - 9,900 kHz Currently most heavily used band
- * 25 m 11,600 - 12,100 kHz
- * 22 m 13,570 - 13,870 kHz substantially used only in Eurasia
- * 19 m 15,100 - 15,800 kHz
- * 16 m 17,480 - 17,900 kHz
- * 15 m 18,900 - 19,020 kHz almost unused, could become a DRM band
- * 13 m 21,450 - 21,850 kHz
- * 11 m 25,600 - 26,100 kHz may be used for local DRM broadcasting
- *
- *
- * Contributor(s):
- * Nathaniel Houghton <nhoughto@qca.qualcomm.com>
- *
- *--------------------------------------------------------------------*/
- /*====================================================================*"
- * system header files;
- *--------------------------------------------------------------------*/
- #include <stdio.h>
- #include <ctype.h>
- #include <math.h>
- #include <ctype.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <string.h>
- /*====================================================================*
- * custom header files;
- *--------------------------------------------------------------------*/
- #include "../tools/getoptv.h"
- #include "../tools/putoptv.h"
- #include "../tools/error.h"
- #include "../tools/flags.h"
- #include "../tools/chars.h"
- #include "../tools/number.h"
- /*====================================================================*
- * custom source files;
- *--------------------------------------------------------------------*/
- #ifndef MAKEFILE
- #include "../tools/getoptv.c"
- #include "../tools/putoptv.c"
- #include "../tools/version.c"
- #include "../tools/error.c"
- #include "../tools/uintspec.c"
- #include "../tools/todigit.c"
- #endif
- /*====================================================================*
- * program constants;
- *--------------------------------------------------------------------*/
- #define _PRINTF_DEBUG
- #define PSNOTCH_VERBOSE (1 << 0)
- #define PSNOTCH_SILENCE (1 << 1)
- #define PSNOTCH_COMMA (1 << 2)
- #define CARRIERS 1155
- #define TONES 917
- #define SLOTS 6
- #define INDEX_TO_FREQ(index) ((float)(index + 74)/40.96)
- #define FREQ_TO_INDEX(freq) ((unsigned)(40.96 * freq)-74)
- /*====================================================================*
- * program variables;
- *--------------------------------------------------------------------*/
- typedef struct carrier
- {
- uint16_t amplitude;
- uint8_t slots [SLOTS];
- }
- carrier;
- typedef struct map
- {
- unsigned slots;
- struct carrier carriers [CARRIERS];
- }
- map;
- uint8_t hambands [CARRIERS] =
- {
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 2,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 1,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- };
- /*====================================================================*
- *
- * int read_scalers (struct map * map);
- *
- * read a prescaler file from stdin; permit comments and blank
- * input lines; the set of prescalers are technically known as
- * an amplitude map;
- *
- * an amplitude map consists an offset (frequency) and a scaler
- * (amplitude); we read, check and discard the offset but store
- * the scaler;
- *
- *--------------------------------------------------------------------*/
- void read_scalers (struct map * map)
- {
- unsigned carriers = 0;
- unsigned tones = 0;
- uint32_t carrier;
- uint32_t amplitude;
- signed c;
- while ((c = getc (stdin)) != EOF)
- {
- if (isspace (c))
- {
- continue;
- }
- if ((c == '#') || (c == ';'))
- {
- do
- {
- c = getc (stdin);
- }
- while (nobreak (c));
- continue;
- }
- carrier = 0;
- while (isdigit (c))
- {
- carrier *= 10;
- carrier += c - '0';
- c = getc (stdin);
- }
- if (carrier != carriers)
- {
- error (1, 0, "Prescaler %d/%d out of order", carrier, carriers);
- }
- if (carrier >= CARRIERS)
- {
- break;
- }
- while (isblank (c))
- {
- c = getc (stdin);
- }
- amplitude = 0;
- while (isxdigit (c))
- {
- amplitude *= 16;
- amplitude += todigit (c);
- c = getc (stdin);
- }
- map->carriers [carrier].amplitude = amplitude;
- if (amplitude)
- {
- tones++;
- }
- while ((c != EOF) && (c != '\n'))
- {
- c = getc (stdin);
- }
- carriers++;
- }
- if (carriers != CARRIERS)
- {
- error (1, 0, "Have %d amplitude map carriers but need %d", carriers, CARRIERS);
- }
- if (tones != TONES)
- {
- error (1, 0, "Expected %d amplitude map scalers but read %d", TONES, tones);
- }
- return;
- }
- /*====================================================================*
- *
- * void write_scalers (struct map * map);
- *
- * print amplitude map on stdout in a format suitabl for input to
- * program psin or the Windows Device Manager;
- *
- *
- *--------------------------------------------------------------------*/
- void write_scalers (struct map * map)
- {
- unsigned carrier = 0;
- for (carrier = 0; carrier < CARRIERS; carrier++)
- {
- printf ("%.8u %.8hX\n", carrier, map->carriers [carrier].amplitude);
- }
- return;
- }
- /*====================================================================*
- *
- * void read_tonemaps (struct map * map, FILE *fp);
- *
- * read tone map from a file; a tonemap file can be created using
- * program int6ktone;
- *
- * input consists of 1159 lines; the first line is a comment; the
- * next two lines contain GIL and AGC information; the remaining
- * 1155 lines consist of an offset follwed by 5 or 6 slot values;
- *
- * although 1155 values are read, the first 917 contain tonemap
- * data and rest contain 0 values; the 917 values correspond to
- * the 917 amplitude scalers;
- *
- * the tone map may be read either before or after the amplitude
- * map is read;
- *
- *
- *--------------------------------------------------------------------*/
- void read_tonemaps (struct map * map, FILE *fp)
- {
- uint8_t slots [SLOTS];
- unsigned tones = 0;
- unsigned tone = 0;
- unsigned slot = 0;
- signed c;
- map->slots = SLOTS;
- memset (slots, 0, sizeof (slots));
- while ((c = getc (fp)) != EOF)
- {
- if (c == '#')
- {
- while (((c = getc (fp)) != EOF) && (c != '\n'));
- }
- if (isspace (c))
- {
- continue;
- }
- tone = 0;
- while (isdigit (c))
- {
- tone *= 10;
- tone += c - '0';
- c = getc (fp);
- }
- if (tone != tones)
- {
- error (1, ECANCELED, "Tonemap %d/%d is out of order", tone, tones);
- }
- while (isblank (c))
- {
- c = getc (fp);
- }
- for (slot = 0; slot < SLOTS; slot++)
- {
- unsigned value = 0;
- while (isdigit (c))
- {
- value *= 10;
- value += c - '0';
- c = getc (fp);
- }
- map->carriers [tone].slots [slot] = value;
- while (isblank (c))
- {
- c = getc (fp);
- }
- }
- while ((c != EOF) && (c != '\n'))
- {
- c = getc (fp);
- }
- tones++;
- }
- if (tones != TONES)
- {
- error (0, 0, "Have %d tone map carriers but need %d", tones, TONES);
- }
- return;
- }
- /*====================================================================*
- *
- * void align_tones (struct map * map);
- *
- * the tonemap consists of 917 consecutive carriers the amplitude
- * map consists of 1155 carriers having 917 non-zero values; this
- * function distributes the tonemap entries so that they align to
- * corresponding amplitude map entries;
- *
- * alignment cannot be performed until both the amplitude map and
- * tone map have been read;
- *
- *
- *--------------------------------------------------------------------*/
- void align_tones (struct map * map)
- {
- unsigned carriers = CARRIERS;
- unsigned tones = TONES;
- while (carriers--)
- {
- if (map->carriers [carriers].amplitude)
- {
- if (tones)
- {
- tones--;
- memcpy (&map->carriers [carriers].slots, &map->carriers [tones].slots, SLOTS);
- memset (&map->carriers [tones].slots, 0, SLOTS);
- }
- }
- }
- return;
- }
- /*====================================================================*
- *
- * unsigned notch_tones (struct map * scalers, unsigned lower, unsigned upper);
- *
- * scan a range of tones for signals; signals are indicated by low
- * mean-square values computed across all slots for a given tone;
- *
- * there may not be much change from one carrier to the next; we
- * accentuate changes by squaring then summing slot values; this
- * produces a reasonably clean parabolic dip in the map where the
- * signal occurs;
- *
- * function watch_tones can be used to observe tone map values and
- * signal dips over a given range of map values; generally, it is
- * best to display a wider range of tones than those being notched;
- *
- *
- *--------------------------------------------------------------------*/
- unsigned notch_tones (struct map * map, unsigned lower, unsigned upper, unsigned limit)
- {
- unsigned slot;
- unsigned notch = 0;
- while (lower < upper)
- {
- unsigned total = 0;
- for (slot = 0; slot < map->slots; slot++)
- {
- unsigned value = 0;
- value = map->carriers [lower].slots [slot];
- value *= value;
- total += value;
- }
- if (slot)
- {
- total /= slot;
- }
- if (total < limit)
- {
- map->carriers [lower].amplitude = 0;
- notch = 2;
- }
- lower++;
- }
- return (notch);
- }
- /*====================================================================*
- *
- * void watch_tones (struct map * map, unsigned lower, unsigned upper);
- *
- * print amplitude and tone values over a given range along with a
- * plot of the values used to detect signal dips; for best effect,
- * the range used here should exceed the notching range to provide
- * context information;
- *
- *
- *--------------------------------------------------------------------*/
- void watch_tones (struct map * map, unsigned lower, unsigned upper)
- {
- unsigned slot;
- while (lower < upper)
- {
- unsigned total = 0;
- fprintf (stderr, "%04d %04X", lower, map->carriers [lower].amplitude);
- for (slot = 0; slot < map->slots; slot++)
- {
- unsigned value = 0;
- value = map->carriers [lower].slots [slot];
- fprintf (stderr, " %02X", value);
- value *= value;
- total += value;
- }
- if (slot)
- {
- total /= slot;
- }
- fprintf (stderr, " %6.3f ", INDEX_TO_FREQ (lower));
- while (total--)
- {
- fprintf (stderr, "#");
- }
- fprintf (stderr, "\n");
- lower++;
- }
- return;
- }
- /*====================================================================*
- *
- * void watch_tone2 (struct map * map, unsigned lower, unsigned upper);
- *
- * print amplitude and tone values over a given range along with a
- * plot of the values used to detect signal dips; for best effect,
- * the range used here should exceed the notching range to provide
- * context information;
- *
- *
- *--------------------------------------------------------------------*/
- void watch_tone2 (struct map * map, unsigned lower, unsigned upper)
- {
- unsigned slot;
- while (lower < upper)
- {
- unsigned total = 0;
- fprintf (stderr, "%d,%d", lower, map->carriers [lower].amplitude);
- for (slot = 0; slot < map->slots; slot++)
- {
- unsigned value = 0;
- value = map->carriers [lower].slots [slot];
- fprintf (stderr, ",%d", value);
- value *= value;
- total += value;
- }
- if (slot)
- {
- total /= slot;
- }
- fprintf (stderr, ",%d", total);
- fprintf (stderr, ",%6.3f", INDEX_TO_FREQ (lower));
- fprintf (stderr, "\n");
- lower++;
- }
- return;
- }
- /*====================================================================*
- *
- * int main (int argc, char const * argv[]);
- *
- * read an amplitude map from stdin and print a notched amplitude
- * map on stdout; use a tone map file to determine if a signal is
- * present where notching chould occur; notching ranges are input
- * as map offsets, not carrier frequencies;
- *
- *
- *--------------------------------------------------------------------*/
- int main (int argc, char const * argv [])
- {
- char const * optv [] =
- {
- "cf:l:L:t:u:U:qv",
- PUTOPTV_S_FILTER,
- "Atheros Prescaler Notching Utility",
- "c\tcomma delimited output",
- "f f\tread tonemap file (f)",
- "t n\tthreshold is (n) units",
- "l n\tlower notch range is (n)",
- "L n\tlower graph range is (n)",
- "u n\tupper notch range is (n)",
- "U n\tupper graph range is (n)",
- "v\tverbose output",
- (char const *)(0)
- };
- struct map map;
- FILE * fp = (FILE *)(0);
- unsigned lower = CARRIERS-1;
- unsigned upper = 0;
- unsigned LOWER = 0;
- unsigned UPPER = CARRIERS-1;
- signed limit = 4;
- signed status = 0;
- flag_t flags = (flag_t)(0);
- signed c;
- memset (&map, 0, sizeof (map));
- while ((c = getoptv (argc, argv, optv)) != -1)
- {
- switch (c)
- {
- case 'c':
- _setbits (flags, PSNOTCH_COMMA);
- break;
- case 'f':
- if ((fp = fopen (optarg, "rb")) == (FILE *)(0))
- {
- error (1, errno, "Can't open %s", optarg);
- }
- read_tonemaps (&map, fp);
- fclose (fp);
- break;
- case 'l':
- lower = (unsigned)(uintspec (optarg, 0, CARRIERS-1));
- break;
- case 'u':
- upper = (unsigned)(uintspec (optarg, 0, CARRIERS-1));
- break;
- case 'L':
- LOWER = (unsigned)(uintspec (optarg, 0, CARRIERS-1));
- break;
- case 'U':
- UPPER = (unsigned)(uintspec (optarg, 0, CARRIERS-1));
- break;
- case 't':
- limit = (signed)(uintspec (optarg, 0, 49));
- break;
- case 'q':
- _setbits (flags, PSNOTCH_SILENCE);
- break;
- case 'v':
- _setbits (flags, PSNOTCH_VERBOSE);
- break;
- default:
- break;
- }
- }
- argv += optind;
- argc -= optind;
- read_scalers (&map);
- align_tones (&map);
- if (_anyset (flags, PSNOTCH_COMMA))
- {
- watch_tone2 (&map, LOWER, UPPER);
- }
- else if (_anyset (flags, PSNOTCH_VERBOSE))
- {
- watch_tones (&map, LOWER, UPPER);
- }
- if (fp)
- {
- status = notch_tones (&map, lower, upper, limit);
- }
- write_scalers (&map);
- return (status);
- }
- </pre>
- <div class='footerlink'>
- [<a href='pskey.c.html' title=' pskey.c '>PREV</a>]
- [<a href='toolkit.html' title=' Index '>HOME</a>]
- [<a href='psout.c.html' title=' psout.c '>NEXT</a>]
- </div>
- </body>
- </html>
|