From audio signal to mean of frequency responses
2 views (last 30 days)
Show older comments
Julia Greeven
on 20 Jul 2022
Commented: Star Strider
on 20 Jul 2022
Hi there,
Im not very advanced in Matlab.
I have an audio signal of exhaling air and want to obtain the mean of frequency responses of that signal so that I can further evaluate the lung function by converting the mean of frequency responses to flow rate. The following steps I want to do
- Segment the file into 100 millisecond segments
- Convert each segment into frequency domain using Fast Fourier Transformation.
- Apply Butterworth filter on each segment to extract frequencies between 100 HZ and 1200 HZ.
- Calculate the mean of frequency responses between 100 HZ and 1200 HZ for each segment.
The following code I found that performs the first two steps. After that I found it difficult to apply a butterworth filter and calculate the mean of frecuency responses.
I hope someone can help me out here.
[data, fs] = audioread('test-kort3.wav');
% read exhalation audio wav file (1 channel, mono)
% frequency is 44100 HZ
% windows of 0.1 s and overlap of 0.05 seconds
WINDOW_SIZE = fs*0.1; %4410 = fs*0.1
array_size = length(data); % array size of data
numOfPeaks = (array_size/(WINDOW_SIZE/2)) - 1;
step = floor(WINDOW_SIZE/2); %step size used in loop
transformed = data;
start =1;
k = 1;
t = 1;
g = 1;
o = 1;
% performing fft on each window and finding the peak of windows
while(((start+WINDOW_SIZE)-1)<=array_size)
j=1;
i =start;
while(j<=WINDOW_SIZE)
WindowArray(j) = transformed(i);
j = j+1;
i = i +1;
end
Y = fft(WindowArray);
p = abs(Y).^2; %power
end
0 Comments
Accepted Answer
Christopher McCausland
on 20 Jul 2022
Hi Julia,
A more intuative approch to get started is to use the design filter fucntion within MATLAB, This would look something like;
function filteredOutput = bandpassFilter(data,fs,LC,HC,Order)
% Create bandstop filter and filter data
% data - a vector of numerical data to filter; fs - sampling freq of data;
% LC - Low cut point; HC - High cut point; Order - specified filter order
% (or as close to order as possiable)
filter = designfilt('bandpassiir','FilterOrder',Order, ...
'HalfPowerFrequency1',LC,'HalfPowerFrequency2',HC, ...
'DesignMethod','butter','SampleRate',fs);
% Optional check what the filter looks like with freqz()
%freqz(filter,521,fs);
% use filtfilt to apply the filter to the data and ensure zero-phase shift
% at the cost of doubling the filter order
filteredOutput = filtfilt(filter,data);
end
The only downside to the filter function is that it will try its best to match the required parameters, however if the response is not mathematically possiable it will either try and fit something as close to what you asked as possiable or throw an error.
@Star Strider also has several great examples on the topic if you want to try generating a butterworth from scratch too, its a great exercise in digital signal processing.
In terms of calculating the mean response I assume you are talking about comparing each window, this is a more probmatic topic (but not impossiable) as you are trying to reduce the signal vector into one value. I would avoid mean and instead focus on median as it is less prone to skewing. Please give me some more information as to what you want the output to look like from this and I will help.
Kind regards,
Christopher
3 Comments
Star Strider
on 20 Jul 2022
@Julia Greeven — Also consider pspectrum with the 'spectrogram' option. (I like it better than the spectrogram function because the units are more appropriate.)
More Answers (0)
See Also
Categories
Find more on Time-Frequency Analysis in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!