フィルターのクリア

Difference between bandpass function and butterwoth bandpass function

12 ビュー (過去 30 日間)
Hi
So I've been using a bandpass filter over netcdf (OLR variable) data to extract only 30-80 days frequencies. The code has been working very well:
frecuencia_min = 1 / 80; % Min frequency (cycle/day)
frecuencia_max = 1 / 30; % Max frequency (cycle/day)
%% Bandpass OLR
olr_real = zeros(length(lon),length(lat),length(time));
tic
for i=1:length(lon)
for j=1:length(lat)
olr_real(i,j,:) = bandpass(squeeze(olr_1(i,j,:)),[frecuencia_min frecuencia_max],1); % data is daily so fs=1
fprintf('[%d] y [%d]\n',i,j);
end
end
toc
And it works perfectly, although its quite long, having dimensions 180x51x136. So I was wondering whats the difference between this function and the butter function. Which one is more efficient? How would you do this code but with the butter function?
Thanks!!

採用された回答

Star Strider
Star Strider 2023 年 9 月 13 日
I always use the 'ImpulseResponse','iir' name-value pair when using bandpass or its friends. That forces it to design a vewry efficient elliptic filter, that is probably the most computationally-efficient discrete filter available (at least in the MATLAB Signal Processing Toolbox). Otherwise, its default is (frequently) a FIR filter. FIR filters have their strengths (such as being able to have multiple passbands and stopbands, or being able to have specific characteristics such as provided by firls), however are usually not the best option.
The Butterworth design as an IIR filter, so similar to the elliptic filter bandpass designs if required to do so.
I would simply use your existing code, adding the 'ImpulseResponse','iir' name-value pair to create a more efficient IIR filter.
Also, you are re-designing the filter with every iteration of the loop. The bandpass function and its friends have a second ‘digital filter’ output, so it is probably better to do something like this:
[olr_real,df] = bandpass(squeeze(olr_1(1,1,:)),[frecuencia_min frecuencia_max],1, 'ImpulseResponse','iir'); % data is daily so fs=1
then in the loop, something like this:
olr_real(i,j,:) = filtfilt(df, squeeze(olr_1(i,j,:)));
I cannot test that, however it should be more efficient.
.
  9 件のコメント
Luis Jesús Olvera Lazcano
Luis Jesús Olvera Lazcano 2023 年 9 月 13 日
編集済み: Luis Jesús Olvera Lazcano 2023 年 9 月 13 日
I have a last question Im so sorry.
So then, having a filter designed with olr(1,1,:) vs another one with olr(1,2,:) should give the same results applying the filter over the whole OLR (180x51x136)? Or if they're different, its too much difference?
UPDATE:
I verified the objects, they're the same :) Thank you so much for everything! Now I have better processed data
Star Strider
Star Strider 2023 年 9 月 14 日
So then, having a filter designed with olr(1,1,:) vs another one with olr(1,2,:) should give the same results applying the filter over the whole OLR (180x51x136)?
Yes.
Thank you so much for everything! Now I have better processed data
As always, my pleasure!
.

サインインしてコメントする。

その他の回答 (0 件)

製品


リリース

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by