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.
11214
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:
HFilter(z)=−b1z−1−b2z−2−b3z−3−…
z- 1
H( z) = 1 - HF i l t e r( z) = 1 + b1z- 1+ b2z- 2+ b3z- 3+ … .
… , - b3, - b2, - b11 , b1, b2, b3, …b0= 1horzcat
dans le script Octave ci-dessous), et enfin la liste est inversée (par flip
):
pkg load signal
b = [-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];
c = flip(horzcat(-b, 1));
freqz(c)
zplane(c)
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:
H( z) = 11 + a1z- 1+ a2z- 2+ a3z- 3+ …
uneb
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
et ellip
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:
Pour de telles fonctions de pondération, qui vont à zéro sur une partie de la bande, il n'y a pas de limite théorique à la réduction de puissance de bruit pondérée pouvant être obtenue à partir du circuit de la figure 1. Ce serait le cas si, par exemple, on suppose que le l'oreille a une sensibilité nulle entre, disons, 20 kHz et la fréquence de Nyquist, et choisit la fonction de pondération pour refléter ce fait.
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
ν= 0dip
pkg load signal
N = 14; #number of taps including leading tap with coefficient 1
att = 97.5; #dB attenuation of Dolph-Chebyshev window, must be positive
dip = 2; #spectrum lift-up multiplier, must be above 1
c = chebwin(N, att);
c = conv(c, c);
c /= sum(c);
c(N) += dip*10^(-att/10);
r = roots(c);
j = (abs(r(:)) <= 1);
r = r(j);
c = real(poly(r));
c .*= (-1).^(0:(N-1)); #if this complains, then root finding has probably failed
freqz(c)
zplane(c)
printf('%f, ', flip(-c(2:end))), printf('\n'); #tobalt's format
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.
pkg load signal
N = length(c);
M = 16384; #signal length
input = zeros(M, 1);#sin(0.01*(1:M))*127;
er = zeros(M, 1);
output = zeros(M, 1);
for i = 1:M
A = input(i) + er(i);
output(i) = round(A + rand() - rand());
for j = 2:N
if (i + j - 1 <= M)
er(i + j - 1) += (output(i) - A)*c(j);
endif
endfor
endfor
pwelch(output, max(nuttallwin(1024), 0), 'semilogy');
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.