2013-04-04 2 views
0

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

+0

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

+0

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

+0

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

Répondre

0

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).

+0

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

Questions connexes