Matlab создает звуки фортепиано (странная проблема со звуком) - PullRequest
0 голосов
/ 31 января 2020

Здравствуйте, мне нужно создать программу, которая способна воспроизводить некоторые звуки фортепиано от Бетховена Элиз

Теперь я реализовал функцию частоты и звука, но она звучит странно и совсем не похоже на ноты фортепиано .

Может ли кто-нибудь дать мне совет, как это исправить?

createWaveform(440,8000,2,1);


    function [sinusoid] = createWaveform(frequency,fs,duration,A)
     n = linspace(0,duration-1/fs,duration*fs);
     sinusoid = 1:duration*fs;
     for i = 1:duration*fs
      sinusoid(i) = A*cos(2*pi*frequency*n(i)*(1/fs)+(2*pi).*rand(1,1));
     end
    end


 end

Вот часть, где я пытаюсь наложить тоны на нужную фортепианную ноту

%function [tone] = note(keynum,relDuration,fullDuration,fs)
   %basetone = 440;
   % frequency = basetone * nthroot(2,12)^(keynum-49);
  %[tone]=createWaveform(frequency,fs,relDuration*fullDuration,1);
%end

Редактировать: я удалил весь свой старый код и написал следующее, что сделало работу

   %sound(createWaveform(1000,8000,1,1));
   sound(note(24,1/2,1,8000));



   function [sinusoid] = createWaveform(frequency,fs,duration,A)
    Fs = fs;                   % samples per second
    dt = 1/Fs;                   % seconds per sample           % seconds
    t = (0:dt:duration)';     % seconds
    %%Sine wave:
    Fc = frequency;                     % hertz
    sinusoid = A.*cos(2*pi*Fc*t+(2*pi).*rand(1,1));
   % Plot the signal versus time:
   end

   function [tone] = note(keynum,relDuration,fullDuration,fs)
             basetone = 440;
             frequency = basetone * nthroot(2,12)^(keynum-49);
             tone=createWaveform(frequency,fs,relDuration*fullDuration,0.5);
   end

   function [E] = envel(relDuration,fullDuration,fs)
   param = 0;
   for i = 0:fs:relDuration*fullDuration
    E(i)=relDuration*fullDuration;
    i=i+1;
   end

   end

1 Ответ

0 голосов
/ 31 января 2020

Как уже упоминалось в Комментариях, звук, который издает пианино, довольно сложный. Таким образом, это не задача Matlab, а просто математическая задача.

Теперь, когда вы знаете это, вам «просто» нужно придумать разумное математическое приближение, и отсюда должно быть просто реализовать в Matlab.

Вот кое-что, чтобы вы начали с математики:

https://dsp.stackexchange.com/questions/46598/mathematical-equation-for-the-sound-wave-that-a-piano-makes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...