Clear Filters
Clear Filters

Filter Sound from Data

2 views (last 30 days)
Sam Hurrell
Sam Hurrell on 22 Feb 2022
Commented: Star Strider on 22 Feb 2022
I have frequency-based data sets (with column 1 for time and column 2 for amplitude), and I use the following code to filter out the sound. I'm not convinced that this is the most effective system as I believe this process changes the time at which other signals occur. Is there a better system for filtering data?
BP = [0.8725 0.8925]; %Frequency filter band
Fs = 1/(data(2,1)-data(1,1)); %Sampling Freq.
Y00 = bandpass(data(:,2),BP,Fs); %Filtered data

Answers (2)

Jan
Jan on 22 Feb 2022
filtfilt works without shifting the data.
  1 Comment
Sam Hurrell
Sam Hurrell on 22 Feb 2022
How is filtfilt different to Bandpass?

Sign in to comment.


Star Strider
Star Strider on 22 Feb 2022
That appears to me to be correct.
If you are using the same filter for all the data sets, return the digital filter object after the first set:
[Y00,df] = bandpass(data(:,2),BP,Fs, 'ImpulseResponse','iir'); %Filtered data
to design an elliptic filter (see ellip for details) and return it as well.
Then in subsequent data sets, use it with filtfilt to do the filtering:
Y01 = filtfilt(df, data2(:,2));
That elimiinates the computational expense of designing the same filter for each signal.
.
  2 Comments
Sam Hurrell
Sam Hurrell on 22 Feb 2022
Apologies as I am not well versed in Matlab, but what dyou mean by "return the digital filter", and how does this work with filtfilt?
Star Strider
Star Strider on 22 Feb 2022
The bandpass and related functions optionally return the digital filter object they created as the second output. See for example the Bandpass Filter Steepness section of the documentation.
data = randn(500,2); % Create Matrix
data(:,1) = linspace(0, 499, 500)'/100;
data2 = randn(500,2); % Create Matrix
t = data(:,1);
BP = [0.8725 0.8925]; %Frequency filter band
Fs = 1/(data(2,1)-data(1,1)); %Sampling Freq.
[Y00, df] = bandpass(data(:,2),BP,Fs,'ImpulseResponse','iir'); %Filtered data
Y01 = filtfilt(df, data2(:,2));
figure
plot(t, Y00)
grid
figure
plot(t, Y01)
grid
The data are synthetic, however the code demonstrates the correct procedure.
.

Sign in to comment.

Tags

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!