diff --git a/src/Petha_Hsu_PitchOffset.m b/src/Petha_Hsu_PitchOffset.m new file mode 100644 index 0000000..908accf --- /dev/null +++ b/src/Petha_Hsu_PitchOffset.m @@ -0,0 +1,50 @@ +% Petha_Hsu_PitchOffset: input a wave and pitch offset (in percentage) +% This function takes a input sound signal and increases the pitch by the +% offset percentage. The output is not 100% accurate. It is only an +% estimation as the information we the function works with is very limited. +% If 100% output is expected, more information like the frequency and type +% of wave would be required. And the estimation only works for +% f_offset > 0.5. Below 0.5, the output is problematic. Again, the output +% is just a good estimation. + +% CONTRIBUTORS: +% Pethaperumal Natarajan: I figured a way to increase the pitch of input +% signal by using fourier transform and shifting the frequency using a for +% loop. Then I used inverse transform to get a sound signal back in the time +% domain. +% Wesley Hsu: I helped solve the problem of being unable to lower frequency +% for the loop using the floor function. This allowed rounding to maintain +% the lower signals that were needed when the code returned the signal back +% into the time domain. + +function y = Petha_Hsu_PitchOffset(x, f_offset) + len = length(x); + X = fft(x); + X = fftshift(X); %Fourier transform the input wave + Y = zeros(1, len); + + midpoint = len/2; + for i = 1:len + %Shifting the Fourier transform in frequency domain to adjust the + %frequency of signal. + %Floor function is used as signals must be integers and not + %doubles. + if floor((i - midpoint) / f_offset + midpoint) < 1 || floor((i - midpoint) / f_offset + midpoint) > len + continue; + end + Y(i) = X(floor((i - midpoint) / f_offset + midpoint)); + end + + %Plotted graphs to troubleshoot the problem. + %Fs = 44800; + %f = Fs *(-len/2 : len/2 -1) / len; + %tiledlayout(1,3); nexttile; + %plot(f, abs(X)); title("input"); nexttile; + %plot(f, abs(Y)); title("output"); nexttile; + + + Y = fftshift(Y); + y = ifft(Y); + y = real(y); + +end \ No newline at end of file