J'ai une collection de données de magnitude et de phase d'un filtre passe-bas simple. Je peux adapter avec succès un filtre à la réponse freq complexe en utilisant invfreqz dans Octave. Cependant, que se passe-t-il si je souhaite adapter le même filtre à un taux d'échantillonnage plus élevé, disons 4x, avec les mêmes données? Cependant, il n'y a pas de données de magnitude et de fréquence disponibles jusqu'à la nouvelle fréquence 4x nyquist. Les données mag et de phase ne peuvent pas être collectées aux fréquences plus élevées, elles doivent donc être ajoutées par une autre méthode ou approximation. Quel serait le moyen le plus simple pour "hacker" les données de magnitude et de phase de remplissage jusqu'à la nouvelle fréquence de nyquist afin qu'invfreqz ait les meilleures chances d'obtenir un bon ajustement pour les données collectées à la nouvelle fréquence d'échantillonnage ?stratégie pour invfreqz dans Octave ou Matlab
Répondre
Voici une fonction que j'ai écrite il y a un certain temps, qui peut être utilisée pour changer les fréquences d'échantillonnage des filtres passe-bande/bas (je n'ai jamais pris la peine de l'étendre au passe-haut). En général, vous devriez choisir le point où la réponse de votre filtre tombe à presque rien comme la fréquence «coupée» (j'hésite à dire «coupure», parce que ce n'est pas une coupure dans le sens normal); au-dessus de cette fréquence, la réponse est mise à zéro.
function [b, a, fNew, HNew, fOld, HOld, HCut] = ...
shiftFilterRate(b, a, fs1, fs2, order, fCut)
% SHIFTFILTERRATE Shift sampling rate of filter
%
% [bNew, aNew] = shiftFilterRate(b, a, fs1, fs2, order, fCut) designs a
% FIR filter of the given order to operate at sampling frequency fs2, in
% Hz, whose frequency magnitude characteristics match those of the filter
% whose coefficients are b, a, that operates at sampling rate fs1, in Hz.
% The function will only try to match the filter's magnitude in the
% region [0 fCut], in Hz.
%
% [bNew, aNew, fNew, HNew, fOld, HOld, HCut] = shiftFilterRate(...)
% returns additional parameters:
% fNew: The frequencies at which the designed filter's transfer
% function was evaluated (with resolution of 1 Hz)
% HNew: The transfer function of the designed filter
% fOld: The frequencies at which the existing filter's transfer
% function was evaluated (with a resolution of 1 Hz)
% HOld: The transfer function of the existing filter.
% HCut: The desired frequency response of the filter used as input
% to the function fir2.
%
% FIXME: Make this work for high pass filters.
%
if nargin < 5, fCut = inf; end
if nargin < 4, order = 50; end
%% Zero padding in frequency domain
res = 1; % Hz resolution
N1 = fs1/res; % points at resolution before padding
% Original freq response
[H, f] = freqz(b, a, N1);
nanInd = find(isnan(H));
% Stabilise. NOTE: Will break if nanInd contains last elem or there are
% multiple NaNs in a row
H(nanInd) = H(nanInd + 1);
f = f/pi;
% Normalise cutoff freq
fCutNorm = fCut/(fs1/2);
% Cut frequencies above fCut, we don't really need them and it makes the
% FIR filter nasty
HCut = H;
HCut(f > fCutNorm) = 0;
% Create new freq response
NNew = ceil(fs2/fs1 * length(HCut));
fNew = linspace(0, 1, NNew)';
HNew = [HCut; zeros(NNew - N1, 1)];
% Design filter
b = fir2(order, fNew, abs(HNew));
a = 1;
HOld = H;
fOld = f;
if nargout > 3
HNew = freqz(b, a, length(fNew));
end
Notez que dans votre cas, vous pouvez le mettre à -20 dB re 1, comme cela semble être l'atténuation maximale de votre filtre fournit. Sur ce point: il ne semble pas que ce soit un très bon filtre ... Y at-il une raison pour laquelle vous avez ont pour correspondre à cette réponse? Vous feriez peut-être mieux de simplement concevoir, par exemple, un Butterworth avec la même coupure (vous obtiendrez certainement plus d'atténuation dans la bande d'arrêt et plus de phase linéaire).
Merci beaucoup. Je vais essayer ça! Oui, la qualité des données n'est pas la meilleure, mais c'est tout ce que je dois travailler à l'époque. Quelqu'un d'autre a recueilli les données et je suppose qu'il y avait des limites de signal/bruit avec l'installation. En ce moment, je ne m'attends pas à obtenir de meilleures données. Est-ce bon d'avoir des options? Je vais essayer toutes vos suggestions. – user2243673
- 1. Comment détecter si j'utilise MATLAB ou Octave?
- 2. Matlab/Octave bwdist() en Python ou C
- 3. Nettoyeur à indentation automatique pour MATLAB ou Octave?
- 4. fonction permute dans matlab/octave
- 5. Comment HTTP GET ou POST avec Matlab ou Octave?
- 6. Filtrage 2D passe-haut dans Matlab/Octave
- 7. Sol Matlab/Octave (678,0) = 677,0?
- 8. Matlab/Octave/Numpy différence numérique
- 9. bonne performance sur Octave ou Matlab/Bad Performance sur gcc
- 10. Vectorisation d'une boucle for dans MATLAB/Octave
- 11. Fonctionnalité de type Matlab/Octave en Java - où chercher
- 12. Octave à la conversion de code Matlab
- 13. Emettre la commande Octave/Matlab depuis LAMP
- 14. MATLAB/Octave: feval avec entrée vectorielle
- 15. Représentation Matlab/Octave 1-of-K
- 16. Ignorer certaines lignes Octave (mais les garder pour Matlab)
- 17. Octave/Matlab - Des données non/parcelle
- 18. Identification (et suppression) des séquences d'un vecteur dans Matlab/Octave
- 19. Implémentation de l'analyse des composants voisins dans Octave/Matlab
- 20. Comment lire une entrée formatée dans matlab/octave?
- 21. alternatif de spsolve et spdiag dans matlab/octave
- 22. Octave/Matlab: changer la valeur à certaine position dans matix
- 23. Chargement des données trimestrielles de FRED dans Matlab/Octave
- 24. MATLAB/Octave: couper beaucoup de cercles à partir d'une image
- 25. Octave sélectionner un fichier?
- 26. Octave/MATLAB: étendues variables et recherche de noms?
- 27. octave (matlab), comment créer des parcelles sans afficher?
- 28. octave est lente; suggestions
- 29. Créer une animation avec plusieurs tracés - Octave/Matlab
- 30. Octave/Matlab: étendre un vecteur qui le fait se répéter?
De quel type de filtre s'agit-il? Si c'est un passe-bas ou un passe-bande, c'est facile. La plupart des filtres passe-haut devraient également convenir. Pouvez-vous mettre une image de l'intrigue grandeur/phase sur [tinypic] (http://tinypic.com/)? Essentiellement, vous voulez choisir une gamme à laquelle vous allez correspondre à la réponse, puis concevoir un nouveau filtre avec 'fir2' ou similaire. Les détails suivront dans une réponse si vous postez une photo de la réponse. – wakjah
Salut. Merci pour la réponse. C'est un filtre passe-bas. J'ai placé l'image de mag et de phase sur tinypic. http://tinypic.com/r/b7yxxl/6 et http://tinypic.com/r/n4e8pi/6 – user2243673
Les données vont jusqu'à 7214. Je peux aller avec invfreq avec Fs = 14428. Cependant, que se passe-t-il si je souhaite utiliser les données comme filtre avec une fréquence d'échantillonnage beaucoup plus élevée, par exemple, 14428 * 4 = 57712? Je dois fouiller les données jusqu'à 28 856. Quelle est la meilleure façon de le faire? – user2243673