2017-02-18 37 views
-1

У меня есть базовые знания быстрого преобразования Фурье, и что он преобразует временную область в частотной области, чтобы получить все образцы, найденные частоты в сигнале или записанный звук ...Быстрое преобразование Фурье для определения частоты фортепиано в MATLAB

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

Средняя нота C изначально на рояле Частота 261,7, но когда я использую ее, выход изменяется по амплитуде голоса (Пример: 261/262/270 ... е дц)

[x,Fs]= readaudio('c4,wav'); 
    xdft = fft(readaudio(c4.wav); 
    [~,index] = sort(abs(xdft() , 'descend')); 
    (index(1)*Fs)/length(x) - (fs/length(x)); 

Также я попытался реализовать такой код посещения много вопросов и форумов, но я не знаю, как применить его к моей идее в целом. (здесь код)

[y,Fs] =audioread('49.wav'); 
    fcuts = [430 438 442 450];    % Frequency Vector (Hz) 
    mags = [0 1 0];  % Magnitude (Defines Passbands & Stopbands) 
    devs = [0.05 0.01 0.05];     % Allowable Deviations 
    [n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,Fs); 
    n = n + rem(n,2); 
    hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'scale'); 
    figure(1) 
    freqz(hh, 1, 2^14, Fs) 
    set(subplot(2,1,1), 'XLim', [0 500])% Set Frequency Axis To Show0-500    Hz 
    set(subplot(2,1,2), 'XLim', [0 500])% Set frequency Axis To Show 0-500 Hz 
    y_filtered = fftfilt(hh, y); 

Но в принципе я не понимаю его и как изменить частоту, чтобы поймать ... но мое видение того, что я сделаю, это передать все частоты, которые я получил из записанного файла, во все фильтры ключей и использовать, если условия if тогда совпадение будет записывать символ ключа на лист.

пожалуйста, если кто-то может объяснить, код и процесс для меня, как я никогда не использовал MATLAB до и вид слабых в своих командах

+3

Сначала вам нужно понять разницу между частотой и высотой тона. –

+0

- это то, что связано с первым кодом или вторым? пожалуйста, укажите путь, который мне нужно переместить :), потому что у меня вообще проблемы с программированием matloab: D –

+1

Ничего общего с Matlab - у вас есть фундаментальное непонимание того, какая частота и шаг. –

ответ

2

Pitch не то же самое, как спектральная частота (возвращаемый голой FFT величины) , Повторные/периодические («стальные») формы сигналов не должны выглядеть ничем иным, как синусоидальной волной.

Возможно, что все частоты, возвращаемые БПФ, полностью отличаются от воспринимаемого тона (см. «Психоакустика» и «Отсутствие фундаментального»). Скорее всего, все высшие гармоники, но, возможно, и некоторые ангармонические обертоны. Это особенно верно для струнных инструментов с «большими» струнами (фортепиано и бас-гитара и т. Д.)

Так что проблема не в коде, а в том, что вы не используете алгоритм определения высоты/оценки высоты , но вместо этого детектор пика спектральной частоты.