From c386637809bf5660c2d23a452c3d1b78176b916e Mon Sep 17 00:00:00 2001 From: TurtleEmperorx Date: Thu, 9 Dec 2021 01:30:51 -0800 Subject: [PATCH] Added Target Dampen and Amplify functions Amplify or dampen an area around the target frequencies. It can handle dual channel audio (like the strong bassline) --- src/AnuragDampenTarget.m | 52 ++++++++++++++++++++++++++++++++++++++ src/AnuragEnchanceTarget.m | 52 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 src/AnuragDampenTarget.m create mode 100644 src/AnuragEnchanceTarget.m diff --git a/src/AnuragDampenTarget.m b/src/AnuragDampenTarget.m new file mode 100644 index 0000000..29d3576 --- /dev/null +++ b/src/AnuragDampenTarget.m @@ -0,0 +1,52 @@ +function output_x = AnuragDampenTarget(x, Fs,TARGET, AreaPercentage) +%Dampen a range of frequencies a percentage around the target frequency +%Also maintain the other frequencies so that the target is muted +%percentage is expressed as a number between 0 and 1. +%target is the midpoint of the frequency range to dampen +%x and Fs are the signal and frequency +% CONTRIBUTORS: +% Anurag Jadhav: function creator + +% Detailed explanation goes here + [dim,len] = size(x); %get length of the input + F = Fs * ((-len/2) : ((len/2) - 1)) / len; + lenf = length(F); + Mod_Freq = ifft(fft(x)); %Fourier Transform of the input signal + output = zeros([1,lenf]); % zero array of size Mod_freq + if(dim == 2) %check for dual channel audio + F = [F;F]; + output = [output;output]; + end + %set the bounds + lowerBound = (1-AreaPercentage) * TARGET; + upperBound = (1+AreaPercentage) * TARGET; +%% Dampen the target frequencies and maintain the others + if(dim == 2) %iterate through both channels if track is dual channel + for n = 1:lenf + if ((lowerBound < abs(F(1,n))) && abs(F(1,n)) < upperBound) + output(1,n) = 1; + else + output(1,n) = 0.5; + end + end + for n = 1:lenf + if ((lowerBound < abs(F(2,n))) && abs(F(2,n)) < upperBound) + output(2,n) = 1; + else + output(2,n) = .5; + end + end + else %iterate onnly once for monochannel + for n = 1:lenf + if ((lowerBound < abs(F(n))) && abs(F(n)) < upperBound) + output(n) = 1; + else + output(n) = .5; + end + end + end +%%Filter the original signal and transform + filtered_Mod_Freq = fftshift(Mod_Freq .* output); + output_x = real(ifft(filtered_Mod_Freq)); + +end \ No newline at end of file diff --git a/src/AnuragEnchanceTarget.m b/src/AnuragEnchanceTarget.m new file mode 100644 index 0000000..33923ce --- /dev/null +++ b/src/AnuragEnchanceTarget.m @@ -0,0 +1,52 @@ +function output_x = AnuragEnchanceTarget(x, Fs,TARGET, AreaPercentage) +%Amplify a range of frequencies a percentage around the target frequency +%Also damnpen the other frequencies so that the target is easier to hear +%percentage is expressed as a number between 0 and 1. +%target is the midpoint of the frequency range to amplify +%x and Fs are the signal and frequency +% CONTRIBUTORS: +% Anurag Jadhav: function creator + +% Detailed explanation goes here + [dim,len] = size(x); %get length of the input + F = Fs * ((-len/2) : ((len/2) - 1)) / len; + lenf = length(F); + Mod_Freq = ifft(fft(x)); %Fourier Transform of the input signal + output = zeros([1,lenf]); % zero array of size Mod_freq + if(dim == 2) %check for dual channel audio + F = [F;F]; + output = [output;output]; + end + %set the bounds + lowerBound = (1-AreaPercentage) * TARGET; + upperBound = (1+AreaPercentage) * TARGET; +%% Amplify the target frequencies and dampen the others + if(dim == 2) %iterate through both channels if track is dual channel + for n = 1:lenf + if ((lowerBound < abs(F(1,n))) && abs(F(1,n)) < upperBound) + output(1,n) = 2; + else + output(1,n) = 0.75; + end + end + for n = 1:lenf + if ((lowerBound < abs(F(2,n))) && abs(F(2,n)) < upperBound) + output(2,n) = 2; + else + output(2,n) = 0.75; + end + end + else %iterate onnly once for monochannel + for n = 1:lenf + if ((lowerBound < abs(F(n))) && abs(F(n)) < upperBound) + output(n) = 2; + else + output(n) = 0.75; + end + end + end +%%Filter the original signal and transform + filtered_Mod_Freq = fftshift(Mod_Freq .* output); + output_x = real(ifft(filtered_Mod_Freq)); + +end \ No newline at end of file