Retour sur la Radio Numérique

 

F5MI JP Mallet

 

La parution d’articles concernant la radio numérique ( Radio-Ref 11&12-1996 ) m’a valu un certain courrier de la part d’Om’s, la plupart du temps désireux d’en savoir davantage sur un procédé qui utilisait d’une manière compacte le Traitement numérique du Signal.

J’ai, je le pense, répondu à tous ceux qui m’ont adressé une QSL, et je sais que certains d’entre vous se sont lancés ( avec succès ) dans la construction d’un récepteur qui ressemblait à ce que j’avais décrit. Depuis 1996, il n’a pas passé que du temps ! La technologie a évoluée, surtout depuis la déferlante GSM. Cela ne s’est pas traduit par des circuits capables de concurrencer le HSP50016, qui reste ce que l’on fait de mieux dans le genre. Mais côté Convertisseurs Analogiques-Digitaux, il y a eu pléthore, et nous allons pouvoir en tirer parti.

Mon ami PT Anderson ( KC1HR ) a fait paraître dans la revue QEX qqs articles intéressants sur le sujet, et il est arrivé au bout de tout ce qu’il a pu tirer du HSP50016. Je n’ai pas suivi tout à fait le même chemin, et le but de cet article est de faire le point, et de voir ce que l’on peut faire en utilisant ce circuit. Comme j’utilise pleinement en parallèle les cartes d’évaluation DSP du commerce, je publierai une suite exhaustive qui fera le point, aussi bien sur l’émission, que sur la transformation d’un Alcatel 2400 pour la réception de la SSB, sans oublier de dire un mot sur la programmation de ces cartes, ce qui n’est pas aussi difficile qu’on se l’imagine. Enfin, j’envisage l’utilisation de la carte son d’un PC pour la transformer en un récepteur SSB ou CW numérique. C’est une suite d’articles qui peut s’avérer longue et passionnante, pour peu qu’entre temps nombre d’entre vous réagissent à mes articles, et m’obligent à préciser certains passages.

A tous ceux qui ne connaissent du Traitement numérique du Signal que les publicités faites dans les revues d’Électronique, je recommanderais de relire mes articles de 1996 et 1997 sur le sujet. J’avais préparé un article de base sur les fondements du DSP, la rédaction de Radio-Ref me l’a refusé en 1997, jugeant qu’il était d’un niveau un peu trop élevé pour la revue. ( Pourtant ce n’était qu’une adaptation de ce qui a été écrit dans le QST. ) Cet article a paru dans la revue Arca97 où l’on peut le retrouver. Je me propose d’en envoyer une photocopie à tous les Om’s qui en feront la demande. ( prévoir 30 pages de photocopies et une enveloppe 21x29.7 ). Il a paru aussi des articles dans la revue Elector, avec un CD-Rom d’accompagnement ( Attention de posséder un Turbo-Pascal ancien fonctionnant sous Dos ). Il n’existe à ma connaissance aucun livre d’abord facile sur le sujet, en Français. Citons quand même :

- Méthodes numériques pour le traitement du signal G.Blanchet Ed. Masson

- Traitement numérique du Signal M.Bellanger Ed. Masson

Ainsi que :Traitement numérique du Signal P.Nus Ed.Publitronic, qui est un ouvrage très spécialisé concernant le processeur DSP Motorola 56002.

Je mets en garde les Om’s sur la lecture de ces ouvrages qui ne concernent nullement les débutants, et qui contiennent des démonstrations mathématiques de haut-niveau.

Enfin, pour ceux qui sont familiers de la langue Anglaise, le must c’est :

- Digital Signal Processing in Communication Systems Marvin E. Frerking Ed. Van Nostrand Reinhold ISBN 0-442-01616-6

- Digital Filter Designer’s Handbook C.Britton Rorabaugh Ed. McGraw-Hill ISBN 0-07-053806-9

On peut obtenir ces livres en France en s’adressant à la Librairie Brentano’s Av. de l’Opéra à Paris. ( Attention au QSJ !.. )

Je viens de recevoir une publicité concernant un livre pour débutant en DSP ! Il s’agit de :

Digital Signal Processing Demystified James D. Broesch CD-Rom inclus ( 49.95$ ), il faut contacter LLH Technology Publishing http://www.LLH-Publishing.com.

Retour sur le Récepteur décrit en 1996.

Lorsque j’ai réalisé la maquette du récepteur décamétrique à base de HSP50016, je vous ai indiqué un certain nombre de limitations concernant cette maquette. :

Limitation aux alentours de 21 Mhz

Obligation d’utiliser certaines astuces comme le suréchantillonnage

Pas de CAG, ce qui conduisait à des surcharges du convertisseur analogue-digital

Pas de mesure de la force du Signal reçu

Enfin le coût des composants sensibles était assez élevé, et leur approvisionnement pas très facile.

Depuis, à l’usage il est apparu un autre défaut mineur ( lié à la construction interne du circuit DDC HSP50016 ). Peter ( KC1HR ) et moi, avons constaté un bruit sur le souffle du récepteur. Ce bruit situé aux environs de –100dbm, et qui bien sur n’est pas gênant outre mesure à la réception des stations, c’est du 1700 Hz, qui est une remontée du système Weaver. La figure 1 représente le schéma bloc du circuit Harris HSP50016.La partie qui fait la transformation du signal complexe en signal réel est en fait un Formateur réalisant les fonctions de l’oscillateur Weaver, non réglable et lié à l’oscillateur principal par construction, et des multiplicateurs et sommateurs conjoints.

Le signal I + Q est sorti sur la seule broche I du circuit. Pour des raisons d’adaptation commode avec le convertisseur digital-analogique faisant suite, le format de la sortie a été choisi à 32 bits.

Tout irait pour le mieux dans le meilleur des mondes, si à l’intérieur du Chip tout se passait avec le même nombre de bits pour tous les organes. Et ce n’est pas le cas comme le montre le schéma bloc de la fig.2.

On voit sur cette figure le fonctionnement du circuit HSP50016. Sa fonction principale consiste à extraire un signal à bande étroite prélevé sur l’entrée qui est à large bande, ce signal est ensuite converti en bande de base, et sorti soit en forme quadrature, soit en forme réelle. Ceci est réalisé en centrant le signal à bande étroite à 0Hz par multiplication des données de l’entrée avec un signal sinusoïdal en quadrature. Un filtre passe bas en quadrature [ Les filtres passe bas réels sont identiques dans les branches I ( en phase ) et Q (déphasées de 90°)] est appliqué au résultat de la multiplication. Chaque chaîne de filtrage consiste en filtres HDF ( Filtre à décimation élevée ) et FIR ( Filtre à réponse impulsionnelle finie ) cascadés, ce qui permet l’extraction du signal à bande étroite. Pendant le filtrage, le signal est décimé avec un rapport qui est proportionnel à la bande passante de sortie. La bande passante du signal résultant est le double de la largeur de la bande passante des filtres passe bas. Un formateur de sortie manipule la sortie du filtre pour sortir les données avec une large variété de formats.

A la sortie du mélangeur digital les sorties sont arrondies symétriquement à 17 bits pour préserver les 102 dB de la gamme dynamique ( SFDR ). On remarque également que la sortie du filtre HDF est à 18 bits. 

La structure du filtre est un filtre de décimation à 5 étages, la largeur de chaque étage diminue de telle façon que les bits LSB

sont perdus en raison de la troncature. Il résulte que les données doivent être traitées dans les parties MSB du filtre, de façon à ce que le bruit dû à la troncature soit inférieur au bruit plancher. Le décalage de ces données est réalisé par le circuit Shifter. La sortie des filtres HDF est transmise à un multiplicateur d’échelle, utilisé pour compenser le gain des filtres HDF, qui dépends lui-même du facteur de décimation. La sortie du multiplicateur d’échelle est arrondie à 17 bits et attaque le filtre FIR. C’est au niveau de cet arrondi que se passe le problème cité plus haut. Cet arrondi provoque un léger décalage spectral des filtres, qui ne peuvent plus être recollés au plus juste, d’ou apparition d’un signal 1700 Hz en sortie, signal dont la force est proportionnelle à l’erreur d’arrondi. Il existe une solution : c’est de faire en sorte que le rapport de décimation des filtres HDF soit une puissance de 2, car dans ce cas là le multiplicateur d’échelle, ainsi que le gain HDF, sont égaux à 1, et l’erreur d’arrondi disparaît.

Seulement voilà, comme tout se paye comptant, cette solution va apporter des valeurs fixes du filtrage obtenu. Les bandes passantes possibles avec une fréquence d’horloge de 50 Mhz seront : 214 Hz, 427 Hz, 855 Hz et 1709 Hz. Les 3 premières largeurs de bande sont tout à fait valables pour la réception des signaux CW, mais le 1709 Hz est quand même un peu juste pour la réception de la SSB. Il faudra à la programmation du Chip décider si on supporte ou non l’inconvénient des remontées de 1700 Hz.

En ce qui concerne la limitation en fréquence autour de 21 Mhz, on trouve maintenant des HSP50016JC-75 ( 98.24$ chez Gerber Electronics à Newark USA , au lieu de 76.11$ pour le modèle JC-52) Ce modèle fonctionne avec un fréquence d’horloge maximale de 75 Mhz, et par conséquent permet de couvrir la gamme 0 – 30 Mhz facilement avec une horloge de 66 Mhz. Prévoir un refroidissement conséquent le circuit consommant 7.5 mA/Mhz, soit 495 mA pour un fonctionnement à 66 Mhz. Un utilisera pour cela un refroidisseur pour PGA collé sur le chip. Il existe chez Radiospares un modèle référencé RTH-368-00 qui fait parfaitement l’affaire. Le passage de l’horloge à 66 Mhz pour couvrir toute la bande OC entraîne le changement du convertisseur analogue-digital, l’ancien modèle étant limité à 20 Mhz.

Analog-Devices vient de sortir un A/D 12 bits, échantillonné à 65 MSPS : le Circuit AD6640.

( Rassurez vous il tourne parfaitement à 66 Mhz, et il est inutile de prévoir une horloge qui sorte des sentiers battus pour le faire fonctionner ) Il est très intéressant car sa gamme dynamique est de 90 dB ( avec dither ) pour une entrée de 1 volts crête/crête ( 350 mV eff. ).

Signalons que l’on peut obtenir des échantillons gratuits de ce produit chez Analog-Devices, si l’on est professionnel de l’Électronique ou si l’on appartient à l’Enseignement. Pour le radioamateur lambda, faire état de sa licence et tenter le coup, il y a des chances pour que cela marche.

Le problème de la CAG peut trouver un commencement de solution en reconvertissant ( par un DAC 8 bits par ex. ) les bits MSB de l’AD6640. On obtient une tension continue fonction de la partie max. du signal reçu. Cette tension sera utilisée pour freiner l’amplification nécessaire entre l’antenne et le CAN AD6640. On ne réalise pas ( pour des raisons que nous verrons plus loin ) une CAG au sens strict du terme, mais plutôt un système qui empêche de surcharger le convertisseur.

Le passage à 66 Mhz d’horloge est bénéfique, car les bandes passantes obtenues seront maintenant de : 282 Hz, 564 Hz, 1128 Hz pour la CW, et 2257 Hz pour la SSB.

Toutes ces modifications nous permettent de réaliser un récepteur à couverture générale, qui peut rivaliser avec ce que l’on fait de mieux à l’heure actuelle. On pourrait être tenté de monter un filtre passe bas, coupant à 30 Mhz, entre l’antenne et le convertisseur A/D. Cela s’appelle un récepteur à large bande, et nous allons voir par le calcul ce qui va nous arriver.

Notons que KC1HR a réalisé une sortie AM synchrone qui fonctionne fort bien avec une bande passante de 6836 Hz, je renvoie ceux qui sont intéressés à l’article du QEX de Septembre 1997. On commence également à avoir des difficultés pour trouver le CAN AD1856N qui est obsolète, un remplacement par des MAX 541/542 de Maxim est tout à fait possible, et n’entraîne que des modifications mineures. ( Maxim fournit également des échantillons gratuits dans les mêmes conditions qu’Analog-Devices ).

Calcul d’un Récepteur DSP à large bande.

Pour mener à bien ce calcul on va supposer un certain nombre de choses au départ :

Tout d’abord que l’entrée est un Filtre passe-bande couvrant de 10 Khz à 30 Mhz

Ensuite qu’il existe une amplification de 30db entre l’antenne et le CA/D

Un deuxième Filtre passe-bande identique au premier est inséré entre l’ampli HF et le Convertisseur A/D

Le facteur de bruit du récepteur est évalué à 10 dB

Toutes les Impédances sont ramenées à 50 V

1)- Calcul du Bruit au Niveau de l’Antenne :

Le Bruit n’est plus ici celui d’une résistance de 50V , mais celui du bruit thermique atmosphérique dans une bande de 30 Mhz.

Ce Bruit est défini par Pn = kTB où B est la bande passante de l’entrée ( 30 Mhz ), k = 1.38 x 10-23 est la Constante de Boltzman et T = 300°K est la température absolue.

Avec les valeurs définies ci-dessus le bruit à l’entrée est évalué à –99.058 dBm

2)- Si l’amplification HF ( Pertes des filtres comprises ) est de 30 dB, et si le facteur de bruit du récepteur est de 10 dB, le bruit total présenté à l’entrée du Convertisseur A/D devient :

( -99.058 + 30 + 10 ) = -59.058 dBm soit 0.249 mV

3)- Si l’on se base sur une spécification typique du SNR du Convertisseur A/D de 67.5 dB, le bruit interne équivalent du convertisseur est trouvé à 0.149 mV ( Notons que la pleine échelle du CA/D est obtenue par un signal de +4 dBm sous 50V ) Ainsi le bruit total en large bande est de 0.249 + 0.149 = 0.398 mV, ce qui donne un rapport Signal / Bruit total de : 58.98 dB

4)- La Bande passante du Convertisseur A/D, qui est la bande passante que le convertisseur digitalise, est toujours égale à la moitié de la fréquence d’échantillonnage soit :

66 / 2 = 33 Mhz. Si nous prenons la largeur du filtrage numérique réalisé par le processeur DDC HSP50016 égale à 2257 Hz ( Cas de la SSB ), le gain amené par le processeur est : 10 x Log ( 33 Mhz / 2257 Hz ) = 41.65 dB, soit un Rapport Signal / Bruit total de 58.98 + 41.65 = 100.63 dB

5)- Si on suppose que le convertisseur A/D doit partager sa Gamme dynamique avec plusieurs porteuses RF, et que le signal doit être conservé en dessous de la pleine échelle pour éviter les surcharges. Si on suppose que 8 porteuses de valeur élevées sont actives ( et d’autres bien moins puissantes un peu partout dans la bande ), et que toutes ces porteuses actives ont la même amplitude, chaque porteuse doit être au moins à 18 dB sous la pleine échelle ( 1/8 de la pleine échelle ). Tous les signaux adjacents de puissance moins élevée nécessitent une garde additionnelle évaluée de 3 à 15 dB. Pour cette discussion 3dB suffiront. Ainsi au total la garde et le fonctionnement en multiporteuses utiliseront un total de 21 dB de rapport Signal / Bruit. Ce qui ramènera le Rapport Signal / Bruit total à 100.63 – 21 = 79.63 dB

En supposant que le rapport C/N ( Porteuse / Bruit ) soit de 10 dB pour faciliter la démodulation, un des 8 signaux doit être réduit de 69.63 dB avant que la démodulation devienne possible.

A ce moment le niveau du signal d’entrée du Convertisseur est à –86.63 dBm, ramené à l’antenne on obtient une sensibilité de –116.63 dBm pour un rapport Signal / Bruit de 10 dB.

Pour augmenter la sensibilité on peut réaliser plusieurs choses :

Premièrement, réduire le facteur de bruit du récepteur. Comme c’est le bruit de l’entrée qui domine les 0.249 mV eff., chaque dB de réduction du facteur de bruit amène 1 dB de plus de sensibilité.

Améliorer la CAG en faisant une CAG à large bande, ce qui est plus facile à écrire qu’à faire

Réduire la Bande passante du filtre d’entrée ( ce qui améliore aussi le facteur de bruit en diminuant les pertes ). A titre indicatif, si on refait tout le calcul pour une bande passante de 500 Khz ( ce qui oblige à mettre des filtres commutables, comme dans les transceivers analogiques ) on obtient une sensibilité de –125 dBm ce qui est un gain appréciable de 8.37 dB.

6)- Cet exemple de limitation par le bruit ne représente pas d’une manière adéquate les vraies limitations d’un récepteur à large bande. D’autres limitations comme SFDR ( Gamme dynamique exempte de raies parasites ) sont plus restrictives que le rapport Signal / Bruit.

En supposant que le convertisseur A/D a une spécification de –80 dBFS ou –76 dBm ( FS est la pleine échelle = +4 dBm ).

En supposant aussi que nous tolérons un C/I ( Porteuse / Interférence, différent de C/N ) de 18 dB, le niveau minimum du signal est –62 dBFS ( -80 + (-18) ) soit –58 dBm. Ramené à l’antenne on trouvera – 88 dBm, ce qui limite la performance du récepteur bien avant la limitation par le bruit. On peut améliorer de 10 dB environ cette performance par l’emploi d’un dither ( système qui combine une addition de bruit blanc à l’entrée du convertisseur ), mais on reste quand même en deçà des performances ultérieures. On peut être tenté par une amplification excessive du signal pour compenser cette limitation, mais se méfier de la CAG qui va devenir indispensable, et de l’augmentation excessive du niveau de bruit à l’entrée du Convertisseur. La seule vraie réponse est l’augmentation du SFDR en choisissant un Convertisseur plus performant ! On n’a pas encore des Convertisseurs avec des SFDR de 150 à 200 dB, échantillonnés à 100 Mhz. !

Il ne faut pas croire que ce genre de limitations est le seul apanage des radios numériques. Il se passe la même chose en analogique au niveau des mélangeurs situés en tête des récepteurs analogiques ( et des préamplis lorsqu’ils sont en service ). Seulement là, c’est en intermodulation que tout se transforme.

La fig. 3. représente un filtre d’entrée variable et connu sous le nom de son inventeur ‘ Filtre Cohn ‘ Ce genre de filtre a des pertes minimales de l’ordre de 6 dB, une sélectivité excellente. Ses Impédances d’entrée et de Sortie sont de 50V , si le rapport des capas C1/C2 et C3/C4 est correctement choisi.

Les inductances doivent avoir un Q élevé.

Un Blindage inter-étages améliore le fonctionnement de l’ensemble

On peut trouver des descriptions de ce filtre sur le QST de Juillet 1970 ( William Sabin, W0IYH ), ou sur Proceedings IRE Août 1959 ( pages 1342-1348 SB Cohn ).

Ce genre de filtre peut être utilisé conjointement avec un Amplificateur à gain variable (VGA) du type AD603 d’Analog-Devices. Cet ampli supporte une gamme de gain programmable, allant de (–11 dB à + 31 dB) sur une bande passante de 90 Mhz, jusqu’à (+9 dB à +51 dB) sur une bande passante de 9 Mhz, avec bien sur toutes les valeurs intermédiaires, ce qui est largement suffisant pour nos besoins. La figure de bruit pour le Gain max. , mesurée à 10 Mhz est de 8.8 dB.

Utilisé avec le filtre Cohn ci-dessus, et un gain variable de –4 dB à +37 dB, on obtient une figure de bruit de 7.3 dB à l’entrée du récepteur, avec un réglage de gain allant de –11 dB à +31 dB en faisant varier la tension de commande entre 1 et 2 volts.

Arrivé à ce point on peut arrêter les transformations, le schéma donné en annexe C  réalise un récepteur capable de rivaliser avec n’importe quel récepteur analogique actuel. Lorsque je dis rivaliser, je parle de l’extraordinaire sélectivité de l’appareil et de la stabilité toute aussi excellente de son oscillateur numérique. J’ai réalisé en 1996 une commande au moyen d’un microprocesseur afin d’éviter d’avoir le fil à la patte du PC, le schéma donne en annexe D l’interface entre PC et récepteur, et en annexe B vous trouverez le code C du programme de contrôle que KC1HR a réalisé. Ceci pour répondre à la demande qui m’en a été faite, ce programme est d’ailleurs disponible sur Internet ftp://oak.oakland.edu /pub/hamradio/arrl/qex, le fichier s’appelle ANDADC.ZIP. On trouvera aussi en annexe A un mode de Calcul pour le HSP50016, la notice étant assez obscure sur ce point.

Récepteur mixte utilisant la partie HF précédente et une carte DSP

La tentation était forte de savoir ce qui allait se passer si on faisait fi de toute la partie logique qui suivait le HSP50016, et si on réunissait ses sorties à une carte DSP. La première des choses à faire est de savoir quelle carte va servir à cet usage. On peut envisager 2 cas de figure : ou l’on construit une carte DSP dédiée à cet usage, ou on utilise une carte d’évaluation du commerce.

Construire une Carte DSP c’est possible, mais vous n’êtes pas sorti de l’auberge pour réaliser le Circuit imprimé ; il faut quand même être un pro de la CAO pour s’en sortir convenablement. Faire tirer un exemplaire double-face, trous métallisés, vernis épargne, etc.. coûte un petite fortune. Il faut ensuite souder les composants.. Et il y a des pattes ! Non ce n’est pas réaliste. Bien sur on peut le wrapper, mais pour ce faire il faut des circuits en boîtier PGA, ce qui ne se trouve pas facilement, et coûte très cher. A titre d’exemple le DSP56002RC40 en boîtier PGA coûte 850 F HT contre 150 F pour le modèle PLCC, et il faut en prendre 2 à la fois !. Question de conditionnement.

Bon, la Carte construite c’est râpé ; alors on se rabat sur les Cartes d’évaluation du commerce.

Il y a 3 modèles courants :

- Texas TMDS3200051 pour DSP C5x ou TMDS3200031 pour DSP C3x., les C5x sont des 16 bits virgule fixe, tandis que les C3x sont des 32 bits en format flottant. Comme les prix sont identiques ( 900 F HT chez Radiospares ) il vaut mieux les C3x.

- Motorola DSP56002EVM (1100 F HT chez Radiospares ) le DSP56002 est un processeur 24 bits à virgule fixe, cadencé à 40 Mhz (extension possible jusqu’à 80 Mhz ). Sur la carte que je possède le processeur utilisé est un 66 Mhz, 30.3ns de cycle d’instruction, 198 Millions d’Opérations par seconde ( MOPS ).

- Analog-Devices ADDS-21XX-EZ-LITE ( 700 F HT chez Radiospares ), le processeur ADSP-2181KS-133 utilisé est un 16 bits à virgule fixe.

Comme aucun de ces modèles n’est prévu pour raccorder d’origine un processeur extérieur comme le HSP50016, il va falloir s’implanter, vérifier si cette modification est possible, et comment la réaliser.

A la sortie du DDC on a 2 possibilités : (On abandonne le mode réel pour le mode complexe )

Soit sortir I suivi de Q sur la seule sortie I

Soit sortir I et Q séparément

Il faut également raccorder les horloges IQSTB et IQCLK au DSP. Après avoir examiné en détail les schémas des différentes cartes, il s’avère que seule la carte Motorola permet une extension facile. En effet cette carte comprend un Codec de chez Crystal Electronics, le modèle CX4215XL1 qui est un Codec BF, entrée/sortie stéréo. Ce composant peut être rendu inactif en enlevant les barrettes de jonction ( réf. J10 ) qui libèrent complètement le Port C du DSP, ce Port est un port 8 bits qui est ainsi devenu libre pour toute extension possible. Une telle modification ne pouvait se faire sur les autres cartes qu’en coupant des pistes, ce qui est toujours aléatoire. De plus le Motorola traite directement des mots de 24 bits, format qui est reconnu par le HSP50016. On reliera donc directement les sorties I, Q, et les horloges à 4 sorties du Port C, les sorties restantes serviront à relier le Port C à un ( ou plusieurs ) Convertisseurs numérique-analogique chargés de traiter la CAG, et la Sortie BF. Enfin le DSP Motorola a un microprocesseur MC68HC705 intégré qui gère 2 sorties RS232, ce qui est très intéressant pour d’éventuelles connections avec, soit des Pc’s, soit d’autres périphériques.

Côté mémoire on dispose sur la carte de 32Ko x 24 bits de mémoire RAM, ainsi que d’un support pour une EEPROM 32Ko x 8 bits, ce qui largement suffisant pour toutes nos applications.

Disons pour être tout à fait objectif, que la Carte d’Analog-Devices a un slot d’extension disponible ( réf. J2 ), sur lequel on trouve 8 bits programmables en I/O ( réf. PF1-PF7 ). Il ne me semble pas très facile de raccorder le récepteur là dessus, à mon sens ces bits servent plus facilement de drapeaux pour signaler des événements extérieurs, que de ports pour transférer des données.

Et maintenant que le récepteur est réuni à un DSP. Que faire ?

Tout d’abord réécrire le programme d’interface entre le DDC et le DSP, et entre le DSP et les convertisseurs D/A de Sortie. Et là on ne peut pas s’inspirer de ce qui avait été fait précédemment pour les Codec’s. Il va falloir tout écrire, bien comprendre les chronogrammes des sorties de l’HSP50016, ainsi que de la liaison entre DSP et CD/A. Sur ce dernier point il se trouve que ce n’est pas foncièrement différent du programme précédent, on ne va pas avoir du mal à modifier le programme. De toute façon ce que je conseille, c’est de commencer par désactiver la liaison entre le DSP et le Codec, mais de garder celle entre l’entrée BF et le DSP. Cela permet de dériver la sortie vers le nouveau convertisseur, et de la tester avec des programmes existants, en particulier un passe-tout qui dirige simplement l’entrée BF vers la sortie sans rien modifier : le signal est digitalisé et le DSP le renvoie en sortie tel quel. Ensuite si cela fonctionne, il va être temps de désaccoupler l’entrée BF, et de la remplacer par le récepteur. Bon, pas de panique, ce n’est pas impossible ( je ne peux pas publier le code, cela sort du cadre de cet article, mais je me propose de réaliser une disquette comprenant le source de tous les programmes que j’aurais mis au point pour cette réalisation ).

Une fois la liaison réalisée, on va devoir traiter les signaux de sortie du récepteur ; soit conserver le système Weaver, et dans ce cas là réécrire toutes les routines de sortie ( Oscillateur Weaver, Multiplicateurs et Additionneur ), soit transformer les sorties ( qui sont en mode complexe ) en un système Phasing ( Déphaseur de Hilbert et additionneur ) selon des algorithmes que j’ai publié en 1997 dans l’article intitulé ‘ Emetteur-Récepteur VHF à DSP ’.

Et ce qui va devenir intéressant, c’est que l’on va pouvoir insérer des algorithmes LMS pour faire du Traitement de bruit. Il n’y a pas de limites à ces programmes, on peut traiter de la FM ( en élargissant la bande passante ), de la PSK, du G3RUH..etc, etc.

Comme on ne travaille plus en mode réel comme avec le HSP50016 utilisé seul, le multiplicateur d’échelle peut être utilisé à sa juste valeur, on n’est plus ennuyé avec les erreurs d’arrondi. Bien entendu d’autres filtres peuvent être insérés aussi bien dans le HSP que dans le DSP, ce qui donne un flexibilité inégalée au système.

L’utilisation de la Carte Motorola permet d’avoir accès au Club Aleff Null à http://www.funet.fi , où vous trouverez nombre de programmes réalisés par divers Om’s, programmes qui vous permettront d’importer des routines pour vos besoins particuliers.

De plus l’accés Internet sur le site de Motorola http://www.mot.com  vous permettra de downloader tout le soft Motorola disponible, en particulier Assembleur, Débogueur, Simulateur, et même Compilateur C. Que ce soit sous Dos, W95, ou Linux ; et tout cela en Freeware ! Le Pied ! Merci Motorola..

Ensuite il faut programmer, regarder ce que les autres ont fait avant vous, essayer de comprendre comment ça marche, et on y arrive petit à petit. C’est là que le livre de Patrice Nus sur le Traitement numérique du Signal ( Ed. Publitronic ) est intéressant.

Où en suis-je en ce moment ? J’ai interfacé sans trop de problèmes le HSP 50016 et le DSP, ainsi que des Convertisseurs CD/A en sortie, ce qui m’a permis de reconstituer le fonctionnement en Weaver ( sans aucune trace du 1700 Hz, quelle que soit la bande passante utilisée ). J’ai réalisé une CAG digitale qui donne 20 dB de CAG purement digitale, avant que le système n’attaque la CAG extérieure de l’AD603.

Ensuite j’ai implanté une routine de LMS qui donne entière satisfaction ( importation d’une routine existante ). Puis j’ai testé le Phasing ; ça marche aussi bien que le Weaver et c’est bien plus simple d’emploi. Alors pourquoi ne pas l’adopter ?

Il faut dire 2 mots de la cohabitation entre les récepteurs numériques ( et éventuellement les cartes DSP associées ) et les ordinateurs de traitement.

Les ordinateurs sont des grands pourvoyeurs de parasites, oiseaux, et sifflements en tous genres. Pour s’en convaincre, il n’y a qu’à mettre en marche un récepteur de trafic raccordé sur une antenne intérieure ( un bout de fil.. ), située dans les parages d’un ordinateur en fonctionnement, et de tourner le bouton d’accord !. Et que faire ?

Ce genre de parasites vient de 3 sources :

Un blindage défectueux côté ordinateur, les caisses à savon dans lesquelles ils sont enfermés ne sont pas souvent des blindages sérieux, au sens HF s’entends.

Un rayonnement très anormal des moniteurs des ordinateurs

Des alimentations mal conçues, et qui rayonnent de la HF par le Secteur.

On va pouvoir remédier partiellement à ces 3 sources de façon à ce que l’on puisse trafiquer correctement en présence d’un ordinateur.

J’utilise personnellement un Vx 386 cadencé à 66 Mhz, et enfermé dans un boîtier grande tour. Il y a de la place et on peut s’y remuer à l’aise. Coté softs, pas de W95, c’est inutile ; seulement le DOS 6.3, et comme programmes : un C++ Borland v3.1, et un Vx Basic comme le Qbasic v4.5 qui permet de compiler les programmes. Bien entendu tout ce qui permet de travailler avec les Dsp’s Motorola ( les autres aussi d’ailleurs ). Une carte son SB16, et une carte I/O additionnelle pour avoir les 4 sorties série et les 2 ports parallèles disponibles.

J’ai la possibilité de commuter les disques durs, et de passer de Dos en mode Linux, ce qui offre des possibilités intéressantes.

L’alimentation à découpage a été entièrement revisitée, pour éliminer tous les parasites qu’elle se faisait un plaisir de cracher joyeusement ! J’ai vu des alims qui avaient 30 volts CC de 50 Khz ( enfin quelque chose d’assez horrible se reproduisant à un fréquence de 50 Khz ) sur les Sorties 5 volts alimentant l’ordinateur. Je vous laisse à penser ce que cela produit comme brouillage au niveau des récepteurs de trafic. Tous les fils de sortie ont été ramenés dans un boîtier faisant corps avec l’alimentation, et les alimentations sont maintenant réalisées au travers de filtres EMI de puissance adéquate. Cette modification ( facile ) enlève au moins 50% des parasites initiaux. En profiter pour relier à la masse à l’intérieur du boîtier d’alimentation tout ce qui est possible, en utilisant des tresses cuivrées pour cela. J’attire l’attention des Om’s non avertis, sur les dangers qu’il y a à bidouiller une alim de PC sous tension. Ces engins redressent le secteur EDF directement, et en plus des tensions alternatives du secteur 220v, on trouve la même tension, redressée et filtrée, aux alentours de 310 Volts continus pour alimenter les transistors de découpage. Donc la plus grande prudence est à respecter. Votre seule sauvegarde étant le disjoncteur du Secteur EDF, ou les fusibles de l’alim et des prises secteurs. La puissance disponible en cas de court-circuit est de plusieurs kilowatts, et le temps de fusion des fusibles et du déclenchement du disjoncteur est suffisamment lent pour envoyer une ‘ bonne pêche ’ aux inattentifs. Rappelons qu’il en faut souvent bien peu pour envoyer l’om chez les ‘ Silent keys ‘. Donc on travaille courant coupé, et on mesure ‘ avec une main dans la poche ’, en réfléchissant à ce que l’on fait. J’espère que tous ceux qui travailleront sur leur alimentation à découpage, auront la présence d’esprit de la débrancher complètement de l’ordinateur, et de la charger par des résistances, de façon à faire débiter le 5 volts ( entre 5 et 10 Ampères ). Faute de quoi on s’expose à ‘ Satelliser son PC ‘ si l’asservissement de l’alimentation se met à faire des siennes.. Je le dis, au cas où il y aurait encore quelques rêveurs qui n’y auraient pas pensé, ou qui s’imagineraient que ça ne peut pas leur arriver.

Je me suis aperçu que les ferrailles cadmiées n’étaient pas des conducteurs au dessus de tout soupçon. Aussi, j’ai installé un collecteur de masse réalisé par une bande cuivrée faisant le tour de l’ordinateur, bande à laquelle ont été réunies toutes les masses possibles des cartes, boîtiers, sorties, et périphériques divers. Enfin des tresses blindées sont placées entre boîtier et couvercle ( c’est pas facile ) avant de refermer l’ensemble.

Normalement l’ordinateur possède un filtre secteur, c’est pas toujours un filtre très efficace, et lorsque l’on empêche les rayonnements de l’alimentation de s’échapper par les fils, ils sortent par le secteur. Le piège absolu consiste à trouver des vrais filtres informatiques ( dans le surplus où chez Radiospares ), de les monter dans un boîtier étanche, et de raccorder au boîtier les fils d’alimentation de l’ordinateur et du moniteur par des fils blindés (il existe du 3 x 1.5 en câble blindé ). Si vous tortillez votre fil d’antenne autour de l’amenée 220 volts ainsi réalisée, et que le Rx reste muet, c’est gagné.

Les moniteurs informatiques font également beaucoup de bruit, et le blindage du câble vidéo n’amène pas grand chose. Dans ce cas là il faut tapisser tout l’intérieur du moniteur par du papier alu ( Attention aux courts-circuits ), et relier ce blindage à la masse ; ça va faire chauffer un peu plus le Moniteur, mais on n’a rien sans rien !

Les Om’s vont dire «  Le père Noël m’a apporté la dernière merveille disponible sur le marché  », et je ne me vois pas intervenir dedans pour tout modifier comme le préconise F5MI.. Bien sur, mais allez donc un peu visiter votre revendeur favori, et vous allez trouver chez lui un tas de cartes de récupération, qui vont vous permettre de bidouiller un Pc pour pas cher. A titre indicatif, je viens de trouver une carte mère 486 DX66 + 16 Mo de mémoire + une carte contrôleur + une carte visu + un clavier pour 200 Fr. Et en prime j’ai eu 2 alimentations en panne ( transistors de découpage HS ) gratuitement. On trouve des Moniteurs 14 " d’occasion pour 300 Fr. et des boîtiers pour 50 Fr., des disques durs 1Mo et des unités de disquettes pour presque rien…. Voir le Prix de revient du PC !. ( Moi tout compris je m’en suis sorti avec 700 Fr. ) Et encore j’habite bien loin des grands centres HI.. L’om informaticien sera ravi de vous voir acheter ces cartes, plutôt que de les coller à la poubelle. En plus, généralement, il vous donnera un coup de main pour les configurer, si vous lui expliquez ce que vous voulez en faire.

Côté récepteur et carte DSP, il faut enfermer tout cela dans un boîtier, et mettre un filtrage informatique sur l’alimentation. Et bien relier les masses. Le DSP56002 a un avantage c’est que son horloge peut être réalisée par un VCO à PLL, ce qui est moins stressant qu’un oscillateur TTL. On peut récupérer la fréquence d’horloge pour s’en servir pour toutes les autres fréquences d’horloge désirées, ce qui est une source d’oiseaux en moins. On n’est pas obligé de faire l’intégralité de ces modifications, en principe l’alimentation, et les masses suffisent pour calmer presque complètement le jeu. Mais il y a des cas récalcitrants où il faut aller jusqu’à éloigner au maximum le Rx de l’ordinateur, comme pour le Kachina où un câble de 4 ou 5 mètres est fourni au cas où ! ! Ici à la station tout est calme, et la cohabitation se passe au mieux. Hi..

J’en suis là de mes essais, je vais marquer une pause, le temps d’écrire ces articles, et de passer la fin d’année en famille, et de rêver que le Père Noël va me faire cadeau du TMS 320 C6x…(1600 MIPS , 200Mhz d’horloge, 8 Instructions traitées en parallèle, etc.. une merveille ! ) et de ses softs.. On peut rêver HI ! !

Voilà, je suis arrivé au bout de mes divagations. Si je pouvais convaincre une grande majorité d’Om’s de me rejoindre dans ces essais, je me sentirais moins seul au fonds du Pays Basque. On peut encore rêver… Avec mes 73’s.

JP MALLET F5MI Décembre 1998

Villa ARGIA

64120 BEGUIOS


Annexe A – Notes de Calcul sur le HSP50016

 

La notice d’utilisation du Circuit HSP50016 est très obscure, et quiconque veut se lancer dans la programmation du circuit est confronté au déchiffrage de cette notice, ce qui n’est pas évident au premier abord.

J’ai donc établi une méthode de calcul pour vous permettre de programmer avec facilité le circuit.

Rappelons que la programmation du Chip se fait au moyen de 8 mots de 40 bits.

- La première des choses à connaître est la fréquence d’échantillonnage que l’on pose comme étant : fs Exemple : fs = 66 Mhz.

- La deuxième chose à déterminer est la bande passante à – 3 dB du filtre total que l’on posera comme étant : -3dB BW Exemple : -3dB BW = 2200 Hz

- Le premier calcul consiste à déterminer le facteur de décimation R du filtre HDF

On peut poser que : R = fs / (-3dB BW / 0.13957 ) soit 66Mhz / ( 2200 / 0.13957 ) = 4187.1

Nous avons vu dans le texte que pour éviter les erreurs de troncature nous mettrons le multiplicateur d’échelle et le gain du filtre HPF à 1, ce qui nous donne pour R des puissances de 2 ; la puissance de 2 la plus proche étant 4096, on adoptera R = 4096

On peut continuer le calcul par la série suivante :

f = fs / R soit : 66 Mhz / 4096 = 16113.3 Hz ( f est le premier passage à zéro de la courbe de réponse du Filtre HDF )

shift = 75 – Ceiling ( 5 log2(R) ) shift = 15

Rappelons que le shift est utilisé par le ‘ data shifter ’, qui positionne les données entrées dans le filtre HDF pour la gamme dynamique maximum, et pour éviter les erreurs de dépassement d’échelle.

Rappelons que : log2 ( R ) = log R / log 2. Dans ce cas log (4096) / log (2) =12

Ceiling ( X ) donne comme résultat X si X est un entier, sinon le résultat est l’entier immédiatement supérieur, dans ce cas 5 log2 ( R ) = 5 x 12 = 60 donc le résultat est 75 – 60 = 15

HDF gain = 1 ( par définition )

Rappelons que dans le cas où l’on n’utilise pas le système Weaver donné ici en exemple, on doit utiliser l’Eq. 3 de la notice HDF Gain = R5 / 2Ceiling(5log2( 5 ))

Scale Factor = 1 ( par définition )

Rappelons que dans le cas où l’on n’utilise pas le système Weaver donné ici en exemple, on doit utiliser l’Eq. 4 de la notice Scale Factor = 2Ceiling(5log2( 5 )) / R5

-3dB BW = 0.13957 x f soit ici 0.13957 x 16113.3 = 2249 Hz

-102dB BW = 0.19903 x f soit ici 0.19903 x 16113.3 = 3207 Hz

Le facteur de forme du filtre obtenu est 3207 / 2249 soit 1.426 à –102 dB ce qui est superbe.

f’’ = f / Décimation du Filtre FIR soit 2 en mode réel et 4 en mode quadrature.

Ici nous sommes en mode réel donc f’’ = 16113.3 / 2 = 8056.7 Hz

Fweaver = f’’ / 4 soit 8056.7 / 4 = 2014 Hz

Rappelons que cette fréquence représente le décalage que nous ferons subir à la fréquence de l’oscillateur local pour la placer au centre de la bande latérale reçue. On peut donc calculer les fréquences de coupure de la bande BF.

Fcoupure basse de la Bande Audio = Fweaver – ( 0.07 x f ) soit 886Hz

Fcoupure haute de la Bande Audio = Fweaver + ( 0.07 x f ) soit 3142Hz

On peut se rendre compte que la bande Audio est bien centrée autour de 2014 Hz.

Farrêt haute de la Bande Audio = Fweaver + ( 0.1 x f ) soit 3625Hz

Le premier alias rencontré en BF sera à 8056.7 – 3625 = 4431.7Hz

IQCLK Rate = ( CLK / Fréquence de IQCLK ) –1 avec CLK = fs = 66Mhz

La fréquence de IQCLK est déterminée par la fréquence de coupure du filtre de reconstruction situé après le DAC ( MAX 294 ), elle est de 100 fois cette fréquence de coupure. On peut choisir une fréquence identique ou supérieure à Fcoupure haute de la Bande Audio, soit ici 3142 Hz. Ce qui nous donne un IQCLK Rate de ( 66Mhz / ( 3142x100 )) –1 = 209.057

Ce rapport doit être une entier compris entre CLK / 2 et CLK / 8192. Choisir 209 donne une fréquence de coupure BF de 3142.85 Hz pour le filtre de reconstruction, et une fréquence de IQCLK de 314285 Hz pour l’horloge, ce qui est acceptable.

On doit ensuite vérifier que IQCLK Rate = 209 est acceptable en vérifiant l’Eq. 9 de la notice.

D’après l’Eq. 8 ( Time Slot Number minimum)

Length min. = [( Nombre de bits de Sortie + 2 ) x Mode ] + 1, avec le Nombre de bits de Sortie positionnés à 32, et le Mode réel = 2 on obtient 69

Ce qui rapporté dans l’Eq.9 IQCLK Rate max. = Floor [ ( R ) x 4 / Length min. ] –1 nous donne la valeur max de IQCLK Rate max. = (4096 x 4 / 69 ) –1 = 236 ( le rapport 209 est acceptable.)

Rappelons que ( Floor ( X ) = partie entière de X ).

Le calcul est maintenant terminé, il ne reste plus qu’à remplir les mots de contrôle en reportant les valeurs obtenues, il y a une conversion binaire à faire, mon propos ne consistant quand même pas à vous expliquer comment transformer 4096 en binaire !

Je n’ai pas parlé du calcul de la fréquence de l’oscillateur local, cela est très simple :

Supposons que nous ayons à recevoir une fréquence de 5 Mhz en LSB. On aura :

FLO = F Désirée – F Weaver soit dans ce cas 5 Mhz – 2014Hz = 4.997986 Mhz

Si fs = 66 Mhz ; l’incrément de phase 32 bits = ( 233 x FLO / fs )

soit ici 650490497, ce qui en binaire donne « 000100110110001011011001010000001 »

que l’on rentrera dans le mot de contrôle 1 en position 4 – 35. Si l’on rajoute 001 en position 2-0 pour le Mode normal, 0 en position 3 pour Test Disabled, 1 en position 36 pour Mettre à jour le registre de contrôle, et 001 en position 36 – 39 pour l’adresse ; le mot de contrôle 1 va devenir : « 00110001001101100010110110010100000010001 ». Il n’y a plus qu’à recommencer pour tous les autres mots, en s’aidant par exemple du programme de KC1HR, pour se rendre compte que cette programmation n’a rien d’insurmontable, d’autant plus que bien des choses sont établies une fois pour toutes.

Le programme de KC1HR pourra être, bien sur, transformé en Basic par tous ceux que le langage C rebute, ou qui ne possèdent pas de compilateur. Il est suffisamment lisible pour cela.

L’adresse Internet de Harris pour télécharger la notice du HSP50016 est la suivante http://semi.harris.com


Control software for ARRL BBS and ftp site:

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

/* CRX50C.C 1sep97 PTAnderson KC1HR */

/* PC control program for 50016 receiver @ 50 MHz */

/* modified from CRX25I.C to double clock frequency:

107Hz bandwidth removed

other bandwidths control words fixed

CW modes changed from lsb to usb

DSB mode changed to turn off Q output

alias code removed

7008 VFO code removed */

/* CRX25I.C: A/D changed to two's complement for AD6640 */

/* G>H added 855HzCW mode */

/* F>G added 214HzCW, 6836DSB modes (no dsb/sam hdwe support yet),

deleted random-access bw keys, changed min freq to zero */

/* modified from RX25N.C 9mar97 PTAnderson KC1HR

modified to simulate microcontroller by using

assembly-level access to printer port */

void prntstr( char str1[] );

void prntchr( char param1 );

/*

int instat( void )

*/

main()

{

int tempint = 0;

int gain_state = 0;

int j = 0;

int c = 'd';

int exit_char = '!';

int mode_number = 5;

char mode_string[] = "mode_str";

char preamble[] = "20011";

char postamble[] = "000001";

char ph_inc_string[] = "20011011001100101110101010001011110010001";

long maxfreq = 22000000;

long freq_step = 10000;

double dfreq_step = 10000.0;

long freq = 6175000;

float tempfloat = 0.0;

double freq_offset = 0.0;

double dfreq = 0.0;

double rxkhz = 0.0;

double dph_inc = 0.0;

long ph_inc = 0;

double fclock = 49999800.0;

double two_up32_over_fclock = 0.0;

two_up32_over_fclock = 4294967296.0 / fclock;

/* initialize receiver to minimum gain */

prntstr("@A\n");

/* initialize control registers 2 and 3 (same data for DSB or SSB or CW) */

prntstr("20100000000000000000000000000000000000000\n");

prntstr("20110000000000000000000000000000000000000\n");

/* print help table */

printf("\nSimulated knobbed interface to receiver CRX50C 1sep97 PTAnderson\

");

printf("\nFrequency range 0 to 22000 kHz");

printf("\n");

printf("\nRF passband center = frequency (-,+ 1.526 kHz for lsb,usb only)");

printf("\n");

printf("\nexit to DOS: set DDC clock kHz: set frequency kHz:");

printf("\n ! # =");

printf("\n");

printf("\nfrequency: freq_step:");

printf("\nq=up a=dn w=up s=dn");

printf("\n");

printf("\ngain:");

printf("\nz=up x=dn c=min");

printf("\n");

printf("\nbandwidth_&_mode:");

printf("\ne=up d=dn");

printf("\n");

printf("\nbandwidth_&_modes available:");

printf("\n6836sam 6836dsb 1709usb 1709lsb");

printf("\n1709cw 855cw 427cw 214cw");

printf("\n");

printf("\ngain, BW_mode, freq_step kHz, rx freq kHz, \

mode#, command:");

printf("\n");

printf("\n");

/* while not exit char */

while(c-exit_char){

/* set preamble and postamble to update 50016 phase increment */

strcpy( preamble,"20011" );

strcpy( postamble,"000001" );

switch (c)

{

case 'z': /* up gain */

if( gain_state > 14 )

gain_state = 15;

else

{

gain_state = gain_state + 1;

prntstr("C");

}

break;

case 'x': /* dn gain */

if ( gain_state < 2 )

{

gain_state = 0;

prntstr("A");

}

else

{

gain_state = gain_state - 1;

prntstr("B");

}

break;

case 'c': /* min gain */

gain_state = 0;

prntstr("A");

break;

case '=': /* set freq in kHz*/

printf("\rfreq kHz ");

cscanf( "%f", &tempfloat );

freq = 1000.0 * tempfloat;

tempint = getch();

break;

case '#': /* set fclock in kHz */

printf("\rclock kHz ");

cscanf( "%f", &tempfloat );

fclock = 1000.0 * tempfloat;

two_up32_over_fclock = 4294967296.0 / fclock;

tempint = getch();

break;

case 'e': /* up mode */

mode_number = mode_number + 1;

if ( mode_number > 6 )

{

mode_number = 7;

}

break;

case 'd': /* dn mode */

mode_number = mode_number - 1;

if ( mode_number < 1 )

{

mode_number = 0;

}

break;

case 'w': /* up freq_step */

freq_step = freq_step * 10;

if ( freq_step > 2000000 )

{

freq_step = 1000000;

}

if ( freq_step == 10000 )

{

freq_step = 5000;

}

if ( freq_step == 50000 )

{

freq_step = 10000;

}

break;

case 's': /* dn freq_step */

freq_step = freq_step / 10;

if ( freq_step < 9 )

{

freq_step = 1;

}

if ( freq_step == 1000 )

{

freq_step = 5000;

}

if ( freq_step == 500 )

{

freq_step = 1000;

}

break;

case 'q': /* up freq */

freq = freq + freq_step ;

break;

case 'a': /* dn freq */

freq = freq - freq_step ;

break;

default:

break;

}

switch (c)

{

case 'e': /* up mode */

case 'd': /* dn mode */

switch (mode_number)

{

case 7: /* 6836 Hz bandwidth synchronous am */

prntstr("21000000000000000000000000000000000111100\n");

prntstr("21010000000111111111100000000000000000101\n");

prntstr("21100000000011101010100100110000000110101\n");

freq_offset = 0;

strcpy( mode_string, "6836_SAM" );

/* add code to turn synch_AM PLL on */

break;

case 6: /* 6836 Hz bandwidth double sideband */

prntstr("21000000000000000000000000000000000111100\n");

prntstr("21010000000111111111100000000000000000101\n");

prntstr("21100000000011101010100100010000000110101\n");

freq_offset = 0;

strcpy( mode_string, "6836_DSB" );

/* add code to turn synch_AM PLL off */

break;

case 5: /* 1709 Hz bandwidth usb */

prntstr("21000000010000000000000000000000000011110\n");

prntstr("21010000111111111111100000000000000000101\n");

prntstr("21100000000011101010100100010000011100100\n");

freq_offset = -1526;

strcpy( mode_string, "1709_USB" );

/* add code to turn synch_AM PLL off */

break;

case 4: /* 1709 Hz bandwidth lsb */

prntstr("21000000010000000000000000000000000011111\n");

prntstr("21010000111111111111100000000000000000101\n");

prntstr("21100000000011101010100100010000011100100\n");

freq_offset = 1526;

strcpy( mode_string, "1709_LSB" );

/* add code to turn synch_AM PLL off */

break;

case 3: /* 1709 Hz bandwidth cw */

prntstr("21000000010000000000000000000000000011110\n");

prntstr("21010000111111111111100000000000000000101\n");

prntstr("21100000000011101010100100010000011100100\n");

freq_offset = 0;

strcpy( mode_string, "1709_CW " );

/* add code to turn synch_AM PLL off */

break;

case 2: /* 855 Hz bandwidth cw */

prntstr("21000000010000000000000000000000000010100\n");

prntstr("21010001111111111111100000000000000000101\n");

prntstr("21100000000011101010100100010000111001000\n");

freq_offset = 0;

strcpy( mode_string, " 855_CW " );

/* add code to turn synch_AM PLL off */

break;

case 1: /* 427 Hz bandwidth cw */

prntstr("21000000010000000000000000000000000001010\n");

prntstr("21010011111111111111100000000000000000101\n");

prntstr("21100000000011101010100100010001110010001\n");

freq_offset = 0;

strcpy( mode_string, " 427_CW " );

/* add code to turn synch_AM PLL off */

break;

case 0: /* 214 Hz bandwidth cw */

prntstr("21000000010000000000000000000000000000000\n");

prntstr("21010111111111111111100000000000000000101\n");

prntstr("21100100000011101010100100010011100100011\n");

freq_offset = 0;

strcpy( mode_string, " 214_CW " );

/* add code to turn synch_AM PLL off */

break;

}

break;

}

if ( freq > maxfreq )

freq = maxfreq;

if ( freq < 0 )

freq = 0;

dfreq = freq;

rxkhz = 0.001*dfreq;

dph_inc = (dfreq-freq_offset) * two_up32_over_fclock;

ph_inc = dph_inc;

dph_inc = ph_inc;

dfreq_step = freq_step;

printf("\r%2.2u %c%c%c%c%c%c%c%c %9.3f %9.3f %2.2u\

%c ", gain_state, mode_string[0], mode_string[1],\

mode_string[2], mode_string[3], mode_string[4], mode_string[5],\

mode_string[6], mode_string[7], dfreq_step, rxkhz,\

mode_number, c);

strcpy( ph_inc_string, preamble );

/* convert thirty bits of ph_inc to ASCII string */

for( j = 0; j < 30; j = j + 1 )

{

ph_inc = ph_inc << 1;

if( ph_inc < 0 )

strcat( ph_inc_string, "1" );

else

strcat( ph_inc_string, "0" );

}

strcat( ph_inc_string, postamble );

/* send forty-one-character string to transceiver on printer port */

for( j = 0; j < 41; j = j + 1 )

{

prntchr(ph_inc_string[j]);/* fprintf(stdprn,"%c", ph_inc_string[j]); */

}

/* send newline characters to keep printer happy */

prntstr("\n");

c = getch();

}

}

/* output function to print a string, replaces fprintf(stdprn,string) */

void prntstr( char str1[]) /* fprintf(stdprn,str1); */

{

int k = 0;

for( k = 0; str1[k] != '\0'; k += 1)

prntchr(str1[k]); /* fprintf(stdprn, "%c", str1[k]); */

}

/* output function to print one character */

void prntchr( char param1 ) /* fprintf(stdprn, "%c", param1); */

{

fprintf(stdprn, "%c", param1);

}

/* input function reads status byte from parallel port */

/*

int instat( void )

{

int inbits = 0;

return( inbits );

}

*/


Retour au menu