My signal after filtering gets attenuated

10 次查看(过去 30 天)
I've been developing the code below to receive an audio signal, then filter it and amplify then plot the output. when I insert amplification gain values to 0 db for all frequency ranges, it's supposed to give me and output signal the same as the input signal. However, I keep getting an attenuated version of it. Can anybody tell me what's wrong with mycode?
Link for wav file I'm using as an input: https://drive.google.com/file/d/17c9DFoXetUyfjFak6RaosGdMSjHM1kxE/view?usp=sharing
PS: that's a shortened sample of the good. I've set the gains array to be of zeroes by default.
% getting the .wav file + its frequency + duration
file = inputdlg('Enter the required wav file name in the format (filename.wav):');
[y,fs] = audioread(file{1});
duration=length(y)/fs;
ofs=str2double(inputdlg('Specify the required output sample rate in Hz:'));
t = linspace(0,duration,length(y)); %time axis to plot any time domain input signals either before or after filtering
ranges = [0 170 310 600 1000 3000 6000 12000 14000 16000];
gains = [0 0 0 0 0 0 0 0 0];
%%filtering the passed audio
filters = []; %an array of the filtered signals
ampFilter = []; %an array of amplified filtered signals
compositeSignal = 0; %output signal
for i = 1:9
switch i
case 1
[num1 den1] = butter(4, 2*170/fs,'low');
filters = [filters filter(num1,den1,y)];
case 2
[num2 den2] = butter(4, [2*170/fs,2*310/fs],'bandpass');
filters = [filters filter(num2,den2,y)];
case 3
[num3 den3] = butter(4, [2*310/fs,2*600/fs],'bandpass');
filters = [filters filter(num3,den3,y)];
case 4
[num4 den4] = butter(4, [2*600/fs,2*1000/fs],'bandpass');
filters = [filters filter(num4,den4,y)];
case 5
[num5 den5] = butter(4, [2*1000/fs,2*3000/fs],'bandpass');
filters = [filters filter(num5,den5,y)];
case 6
[num6 den6] = butter(4, [2*3000/fs,2*6000/fs],'bandpass');
filters = [filters filter(num6,den6,y)];
case 7
[num7 den7] = butter(4, [2*6000/fs,2*12000/fs],'bandpass');
filters = [filters filter(num7,den7,y)];
case 8
[num8 den8] = butter(4, [2*12000/fs,2*14000/fs],'bandpass');
filters = [filters filter(num8,den8,y)];
case 9
[num9 den9] = butter(4, [2*14000/fs,2*16000/fs],'bandpass');
filters = [filters filter(num9,den9,y)];
end
ampFilter = [ampFilter (10^(gains(i)/20))*filters(:,i)];
compositeSignal = compositeSignal + filters(:,i);
end
%plot the signal in time & frequency domain before and after
figure;
sub1=subplot(2,1,1);
plot(sub1,t,y); xlabel('time'); title('Before Amplification (time domain)');
sub4=subplot(2,1,2);
to = linspace(0,length(compositeSignal)/ofs,length(compositeSignal)); %an axis for output signal using the output sampling frequency recevied from user
plot(sub4,to,compositeSignal);xlabel('time');title('After Amplification (time domain)');
% play and save the composite wave signal to a wav file
sound(compositeSignal,ofs);
audiowrite('compositeSignal.wav',compositeSignal,ofs);

采纳的回答

Mariam Atef
Mariam Atef 2022-5-29
The issue got solved for the IIR filter when I've set the order to 1 instead of 3. According to my searches, butterworth filter on Matlab causes slight attenuation to signals.
As for FIR, I've increases the order to 600 and it has worked as well.

更多回答(1 个)

William Rose
William Rose 2022-5-29
@Mariam Atef, please include a short .wav file so we can run your code. Please post the most simple possible version of your code that demonstrates the unexpected or unwanted behavior. Thank you.

类别

Help CenterFile Exchange 中查找有关 Introduction to Installation and Licensing 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by