MATLAB — изменение высоты тона аудиосигнала

Моя группа разрабатывает простой графический интерфейс пользователя (GUI) MATLAB, который должен записывать звук с микрофона, подключенного или встроенного в компьютер, и воспроизводить сигнал. Пока у нас это завершено. Наш графический интерфейс также может загружать образец (файл .wav и т. д.) и воспроизводить его с помощью той же кнопки «Воспроизвести» в графическом интерфейсе. У нас есть кнопки воспроизведения, записи, загрузки и сохранения. Теперь о смещении высоты тона загруженных или записанных сэмплов... Мы знаем, что нам нужен алгоритм выделения пиков, чтобы найти основные частоты сигналов. Тогда мы подумали, что можем умножить каждое из этих значений на константу, чтобы изменить высоту тона всех этих частот. То, что мы хотим сделать, это использовать этот алгоритм и назначать отдельные сдвиги для разных кнопок или радиокнопок, в которые мы можем загрузить наш семпл, нажать кнопку и, таким образом, управлять высотой тона, а затем воспроизвести его. Сможет ли использование алгоритма пикового пикинга достаточно изменить высоту тона наших сигналов, или сигнал будет искажаться во время воспроизведения?

(ЭТО НЕ ОБРАБОТКА В РЕАЛЬНОМ ВРЕМЕНИ)


person user2817753    schedule 19.11.2013    source источник
comment
сдвиг высоты тона может быть достигнут несколькими способами, вы можете изменить фазу сигнала или вы можете понизить дискретизацию, но продолжать воспроизводить его с более высокой частотой дискретизации. Первый вариант не будет искажать время, а второй будет   -  person MZimmerman6    schedule 19.11.2013
comment
Первый метод называется фазовым вокодированием. Фазовый вокодер   -  person MZimmerman6    schedule 19.11.2013


Ответы (3)


Как упоминалось в моих комментариях выше, на самом деле есть два подхода, которые вы можете использовать: фазовые вокодеры или более высокие частоты дискретизации. Первый метод с использованием вокодера будет поддерживать длину сигнала при смещении содержащихся частот выше. Я не буду описывать алгоритм того, как это сделать, но код для этого находится в открытом доступе в Колумбийском университете — http://www.ee.columbia.edu/ln/labrosa/matlab/pvoc./

Второй способ — просто записать файл *.wav с более высокой частотой дискретизации.

скажем, у вас есть сигнал с частотой 440 Гц, который вы хотите получить с частотой 880 Гц, просто удвойте частоту дискретизации.

поэтому вместо wavwrite(signal,fs,'file') используйте wavwrite(signal,2*fs,'file')

Это, однако, сократит длину аудиофайла независимо от того, насколько вы увеличили частоту дискретизации.

В целом, я думаю, что лучший и более впечатляющий метод - это вокодер, я бы не рекомендовал просто слепо использовать код из Колумбии, но на самом деле потратить время, чтобы понять его и быть в состоянии математически объяснить логику, стоящую за всем этим.

person MZimmerman6    schedule 19.11.2013
comment
код открыт : Страница не найдена Запрашиваемая страница не найдена. - person GabrieleG; 18.11.2020
comment
Я думаю, что это был этот (новый URL, не могу больше редактировать предыдущий комментарий ..): ee.columbia.edu/~dpwe/resources/matlab/pvoc - person GabrieleG; 18.11.2020

Что-то немного более простое, чем алгоритм Колумбии (не столь высокопроизводительное, но, возможно, дает вам представление о том, как он работает), будет выглядеть примерно так:

  1. Возьмите БПФ
  2. Используйте interp1 для повторной выборки БПФ с более высокой частотой дискретизации; например, чтобы сдвинуться вверх на 1 полную ноту (2 полуноты), вы можете сделать

F1 = fft(originalSignal);
N = numel(F1);
F1a = F1(1:N/2);         % the lower half of the fft
F1b = F1(end:-1:N/2+1);  % the upper half of the fft - flipped "the right way around"
t1 = 1:N/2;              % indices of the lower half
t2 = 1+ (t1-1) / (1 + 2.^(2/12)); % finer sampling... will make peaks appear higher
F2a = interp1(t1, F1a, t2); % perform sampling of lower half
F2b = interp1(t1, F1b, t2); % resample upper half
F2 = [F2a F2b(end:-1:1)];   % put the two together again
shiftedSignal = ifft(F2);   % and do the inverse FFT

I did not do any windowing etc, so this is "approximate". In reality you want to process little overlapping chunks of data one at a time, rather than the entire file at once. So the above should be considered really "for illustration only", and not working code.

person Floris    schedule 19.11.2013
comment
Я никогда не пробовал это раньше, но определенно +1 за то, что познакомил меня с чем-то немного другим. - person MZimmerman6; 19.11.2013
comment
Я не люблю поднимать мертвых из могилы, но здесь может быть что-то не так с передискретизацией. Строка генерации новых моментов времени для интерполяции кажется неподходящей для смещения высоты тона на 1 полный тон. должно быть: t2 = t1/2^(2/12); - person Siddharth Kumar; 08.10.2015

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

Если ваш вход с микрофона всегда монофонический, вам следует рассмотреть метод PSOLA, работающий во временной области. и вы можете получить хорошие результаты в голосовых сигналах

person ederwander    schedule 19.11.2013