Je veux faire une mise en forme du bruit dans une application 100 kHz, 16 bits, de manière à déplacer tout le bruit de quantification vers la bande 25 kHz-50 kHz, avec un bruit minimal dans la bande DC-25 kHz.
J'ai mis en place mathématique pour créer un noyau de filtre d'erreur à 31 échantillons via un apprentissage par renforcement qui fonctionne bien: après un peu d'apprentissage, je peux obtenir une amélioration d'environ 16 dB du bruit haute fréquence pour environ la même quantité de réduction dans la bande basse fréquence (la la ligne centrale est le niveau de bruit de vibration non formé). Ceci est conforme au théorème de mise en forme du bruit "Gerzon-Craven".
Passons maintenant à mon problème:
Je n'arrive pas à façonner le bruit encore plus même après un apprentissage approfondi, bien que le théorème de Gerzon-Craven ne l'interdise pas. Par exemple, il devrait être possible d'obtenir une réduction de 40 dB dans la bande basse et une amélioration de 40 dB dans la bande haute.
Y a-t-il donc une autre limite fondamentale que je rencontre?
J'ai essayé d'examiner les théorèmes de bruit / échantillonnage / information de Shannon, mais après y avoir longuement réfléchi, je n'ai réussi à en déduire qu'une seule limite: le théorème de Gerzon-Craven, qui semble être un résultat direct du théorème de Shannon.
Toute aide est appréciée.
EDIT: plus d'infos
Tout d'abord, le noyau de filtre qui produit la mise en forme du bruit ci-dessus, notez que l' échantillon le plus récent est sur le côté droit . Valeurs numériques du graphique à barres arrondies à 0,01: {-0,16, 0,51, -0,74, 0,52, -0,04, -0,25, 0,22, -0,11, -0,02, 0,31, -0,56, 0,45, -0,13, 0,04, -0,14, 0,12, -0,06, 0,19, -0,22, -0,15, 0,4, 0,01, -0,41, -0,1, 0,84, -0,42, -0,81, 0,91, 0,75, -2,37, 2,29} (pas exactement le bar bar mais produit une courbe similaire )
Une autre note sur la mise en œuvre du retour d'erreur:
J'ai essayé deux implémentations différentes du retour d'erreur. J'ai d'abord comparé l'échantillon de sortie arrondi à la valeur souhaitée et j'ai utilisé cet écart comme erreur. Deuxièmement, j'ai comparé l'échantillon de sortie arrondi à (entrée + retour d'erreur). Bien que les deux méthodes produisent des noyaux assez différents, les deux semblent se stabiliser à environ la même intensité de mise en forme du bruit. Les données publiées ici utilisent la deuxième implémentation.
Voici le code utilisé pour calculer les échantillons d'ondes numérisés. étape est la taille d'étape pour l'arrondi. wave est la forme d'onde non numérisée (généralement des zéros uniquement quand aucun signal n'est appliqué).
TestWave[kernel_?VectorQ] :=
Module[{k = kernel, nf, dith, signals, twave, deltas},
nf = Length@k;
dith = RandomVariate[TriangularDistribution[{-1, 1}*step], l];
signals = deltas = Table[0, {l}];
twave = wave;
Do[
twave[[i]] -= k.PadLeft[deltas[[;; i - 1]], nf];
signals[[i]] = Round[twave[[i]] + dith[[i]], step];
deltas[[i]] = signals[[i]] - twave[[i]];
, {i, l}];
signals
]
La méthode de renforcement:
Le "score" est calculé en examinant le spectre de puissance de bruit. L'objectif est de minimiser la puissance de bruit dans la bande DC-25kHz. Je ne pénalise pas le bruit dans la bande des hautes fréquences, donc un bruit arbitrairement élevé ne diminuerait pas le score. J'introduis du bruit dans les poids du noyau pour apprendre. Peut-être, par conséquent, je suis dans un minimum local (très large et profond), mais je considère cela extrêmement peu probable.
Comparaison avec la conception de filtre standard:
Mathematica permet de générer des filtres de manière itérative. Ceux-ci peuvent avoir un contraste bien meilleur que 36 dB lorsque leur réponse en fréquence est tracée; jusqu'à 80-100 dB. Valeurs numériques: {0,024, -0,061, -0,048, 0,38, -0,36, -0,808, 2,09, -0,331, -4,796, 6,142, 3,918, -17,773, 11,245, 30,613, -87,072, 113,676, -87,072, 30,613, 11,245 , -17,773, 3,918, 6,142, -4,796, -0,331, 2,09, -0,808, -0,36, 0,38, -0,048, -0,061, 0,024}
Cependant, lors de l'application de ceux dans la mise en forme réelle du bruit, ils sont (a) fixés au même contraste de ~ 40 dB, (b) fonctionnent moins bien que le filtre appris sans aucune atténuation du bruit.
Réponses:
Tramage de base sans mise en forme du bruit
La quantification de base tramée sans mise en forme du bruit fonctionne comme ceci:
Figure 1. Schéma du système de quantification de base tramé. Le bruit est un tramage triangulaire à moyenne nulle avec une valeur absolue maximale de 1. L'arrondi est à l'entier le plus proche. L'erreur résiduelle est la différence entre la sortie et l'entrée, et est calculée pour l'analyse uniquement.
Avec une erreur résiduelle additive indépendante, nous aurions un modèle plus simple du système:
Figure 2. Approximation de la quantification de base tramée. L'erreur résiduelle est le bruit blanc.
Dans le modèle approximatif, la sortie est simplement entrée plus une erreur résiduelle de bruit blanc indépendante.
Tramage avec mise en forme du bruit
Je ne peux pas très bien lire Mathematica, donc au lieu de votre système, j'analyserai le système de Lipshitz et al. " Mise en forme du bruit minimalement audible " J. Audio Eng. Soc., Vol.39, No.11, novembre 1991:
Figure 3. Lipshitz et al. Schéma du système de 1991 (adapté de leur Fig. 1). Le filtre (en italique dans le texte) comprend un délai d'un échantillon afin qu'il puisse être utilisé comme filtre de retour d'erreur. Le bruit est un tramage triangulaire.
Si l'erreur résiduelle est indépendante des valeurs actuelles et passées du signal A, nous avons un système plus simple:
Figure 4. Un modèle approximatif de Lipshitz et al. Système de 1991. Le filtre est le même que sur la figure 3 et comprend un retard d'un échantillon. Il n'est plus utilisé comme filtre de rétroaction. L'erreur résiduelle est le bruit blanc.
Dans cette réponse, je travaillerai avec le modèle approximatif plus facilement analysable (Fig. 4). Dans l'original Lipshitz et al. Système de 1991, Filter a une forme de filtre générique à réponse impulsionnelle infinie (IIR) qui couvre à la fois les filtres IIR et à réponse impulsionnelle finie (FIR). Dans ce qui suit, nous supposerons que Filter est un filtre FIR, comme je le crois d'après mes expériences avec vos coefficients, c'est ce que vous avez dans votre système. La fonction de transfert du filtre est:
horzcat
dans le script Octave ci-dessous), et enfin la liste est inversée (parflip
):Le script trace la réponse en fréquence d'amplitude et les emplacements zéro du filtre de mise en forme du bruit complet:
Figure 5. Réponse en fréquence d'amplitude du filtre de mise en forme du bruit complet.
Je pense que le problème de trouver les coefficients du filtre peut être reformulé comme le problème de la conception d'un filtre à phase minimale avec un coefficient de tête de 1. S'il existe des limitations inhérentes à la réponse en fréquence de ces filtres, alors ces limitations sont transférées à des limitations équivalentes dans la mise en forme du bruit qui utilise de tels filtres.
Conversion de la conception omnipolaire en FIR à phase minimale
Une procédure de conception de filtres différents mais à bien des égards équivalents est décrite dans Stojanović et al. , "Conception de filtres numériques récursifs tous pôles basée sur des polynômes ultraspheriques", Radioengineering, vol 23, no 3, septembre 2014. Ils calculent les coefficients de dénominateur de la fonction de transfert d'un filtre passe-bas multipolaire IIR. Ceux-ci ont toujours un coefficient de dénominateur avancé de 1 et ont tous les pôles à l'intérieur du cercle unitaire, une exigence de filtres IIR stables. Si ces coefficients sont utilisés comme coefficients du filtre de mise en forme du bruit FIR à phase minimale, ils donneront une réponse en fréquence passe-haut inversée par rapport au filtre passe-bas IIR (les coefficients du dénominateur de la fonction de transfert devenant des coefficients du numérateur). Dans votre notation, un ensemble de coefficients de cet article est
{-0.0076120, 0.0960380, -0.5454670, 1.8298040, -3.9884220, 5.8308660, -5.6495140, 3.3816780}
, qui pourrait être testé pour l'application de mise en forme du bruit, bien qu'il ne soit pas exactement conforme aux spécifications:Figure 7. Réponse en fréquence d'amplitude du filtre FIR à l'aide des coefficients de Stojanović et al. 2014.
Figure 8. Diagramme à pôles zéro du filtre FIR à l'aide des coefficients de Stojanović et al. 2014.
La fonction de transfert omnipolaire est:
Pour concevoir un filtre omnipolaire et le convertir en un filtre FIR à phase minimale, vous ne pourrez pas utiliser les méthodes de conception de filtre IIR qui partent d'un filtre prototype analogique et mappent les pôles et les zéros dans le domaine numérique à l'aide de la transformation bilinéaire. . Cela inclut
cheby1
,cheby2
etellip
dans Octave et Scyth de Python. Ces méthodes éloigneront les zéros de l'origine du plan z, de sorte que le filtre ne sera pas du type multipolaire requis.Réponse à la question théorique
Si vous ne vous souciez pas de la quantité de bruit à des fréquences supérieures au quart de la fréquence d'échantillonnage, alors Lipshitz et al. 1991 répond directement à votre question:
Leur Fig 1. montre un shaper de bruit avec une structure de filtre IIR générique avec des pôles et des zéros, si différente de la structure FIR que vous avez en ce moment, mais ce qu'ils disent s'applique également à cela, car une réponse impulsionnelle du filtre FIR peut être arbitrairement proche de la réponse impulsionnelle de tout filtre IIR stable donné.
Script d'octave pour la conception de filtres
dip
Il commence par une fenêtre Dolph-Chebyshev comme coefficients, la convolution avec elle-même pour doubler les zéros de la fonction de transfert, ajoute au tapotement central un nombre qui "élève" la réponse en fréquence (considérant le tapotement médian comme étant à zéro) donc qu'il est partout positif, trouve les zéros, supprime les zéros qui sont en dehors du cercle unitaire, reconvertit les zéros en coefficients (le coefficient de tête de
poly
est toujours 1) et retourne le signe de chaque deuxième coefficient pour faire passer le filtre passe-haut . Les résultats (d'une version plus ancienne mais presque équivalente) du script semblent prometteurs:Figure 9. Réponse en fréquence d'amplitude du filtre à partir d'une version plus ancienne mais presque équivalente du script ci-dessus.
Figure 10. Graphique à pôles zéro du filtre (d'une version plus ancienne mais presque équivalente) du script ci-dessus.
Les coefficients de (une ancienne mais presque version équivalente) , le script ci - dessus dans votre notation:
{0.357662, -2.588396, 9.931419, -26.205448, 52.450624, -83.531276, 108.508775, -116.272581, 102.875781, -74.473956, 43.140431, -19.131434, 5.923468}
. Les nombres sont importants, ce qui pourrait entraîner des problèmes numériques.Implémentation octave de la mise en forme du bruit
Enfin, j'ai fait ma propre implémentation de la mise en forme du bruit dans Octave et je n'ai pas de problèmes comme vous. Sur la base de notre discussion dans les commentaires, je pense que la limitation dans votre mise en œuvre était que le spectre de bruit a été évalué en utilisant une fenêtre rectangulaire aka "pas de fenêtrage", qui a renversé le spectre haute fréquence vers les basses fréquences.
Figure 11. Analyse spectrale du bruit de quantification à partir de l'implémentation d'octave ci-dessus de la mise en forme du bruit pour un signal d'entrée à zéro constant. Axe horizontal: fréquence normalisée. Noir: pas de formation de bruit (
c = [1];
), rouge: votre filtre d'origine, bleu: le filtre de la section "Script d'octave pour la conception du filtre".Figure 12. Sortie dans le domaine temporel de l'implémentation d'octave ci-dessus de la mise en forme du bruit pour un signal d'entrée à zéro constant. Axe horizontal: numéro d'échantillon, axe vertical: valeur d'échantillon. Rouge: votre filtre d'origine, bleu: le filtre de la section "Script d'octave pour la conception du filtre".
Le filtre de mise en forme de bruit plus extrême (bleu) produit des valeurs d'échantillonnage de sortie quantifiées très importantes même pour une entrée nulle.
la source