Аудиоспектр, сдвиг высоты тона и общая обработка звука в MATLAB - PullRequest
0 голосов
/ 12 сентября 2018

Я пишу программу MATLAB, которая использует основную информацию (например, la4 или A4 на частоте 440 Гц), и, после того, как пользователь спросил, какую частоту он хочет, программа выдаст транспонированный звук. Например, если пользователь хочет получить частоту 880 Гц от исходного файла, которая составляет 440 Гц, он будет удваивать каждую частоту (включая гармоники).

Я пытался использовать MIRPitch, который здесь не реализован, но функция все равно не работала после установки всех наборов инструментов.

Как я могу взять фундаментальный? Как я могу перенести это другими способами?

[y,Fs]=audioread("Test.wav");
[x,Fs]=audioread("LookingForHappiness.mp3");
D=0.8;
%D=(1/Fs)*length(x);
% Digital format ----------------------------------------------------------

Fs=44100;       % Sampling rate (Hz)
Ts=1/Fs;        % Sampling Period (s)



% Start DFT -------------------------------------------------------------


W=D;                % Set the window analysis to pattern duration
N=W/Ts;             % Samples in a window frame
F0=1/W;             % Fourier fundamental frequency
K=Fs*W;             % Total computable frequencies

for k=0:K-1         % k is the frequency index (f=K*F0)
    for(n=0:N-1)
        s(n+1)=sin(2*pi*k*F0*n*Ts);  % n is the time index (t=n*Ts)
        c(n+1)=cos(2*pi*k*F0*n*Ts);  % n is the time index (t=n*Ts)
    end
    Xi(k+1)=0;
    Xr(k+1)=0;
    for (n=0:N-1)
        Xi(k+1)=Xi(k+1)+x(n+1)*s(n+1);
        Xr(k+1)=Xr(k+1)+x(n+1)*c(n+1);
    end
    Xi(k+1)=Xi(k+1)/N;        % Scale by 1/N each frequency bin
    Xr(k+1)=Xr(k+1)/N;        % Scale by 1/N each frequency bin
end
Xi(1)=Xi(1)/2;                % Frequency 0 amplitude is scaled by 1/N
Xr(1)=Xr(1)/2;                % Frequency 0 amplitude is scaled by 1/N

% Show results ------------------------------------------------------------

Xa=2*sqrt(Xi.^2+Xr.^2);       % Computes amplitude spectrum

Fscale=0:F0:(Fs/2);
subplot(2,1,1);
plot(Fscale,Xa(1:K/2+1));    % Plot the amplitude spectrum
xlabel ('frequency (Hz) ')
subplot(2,1,2);
plot(x(1:2));              % Plot the signal  %era 1:100
xlabel ('time (s) ')
sound("L4A.mp3");
...