Как сдвинуть высоту тона вверх, не искажая аудиосигнал? ⇐ Python
-
Anonymous
Как сдвинуть высоту тона вверх, не искажая аудиосигнал?
Чтобы лучше понять алгоритмы изменения высоты звука, я пытаюсь написать собственную (по общему признанию упрощенную) программу изменения высоты звука с нуля. audioData — это NDarray, представляющий файл WAV, прочитанный с помощью scipy.io.wavfile.read().
def ChangePitch(self, Pitch, AudioData): # конвертируем аудиосигнал в частотную область с помощью быстрого преобразования Фурье fft = np.fft.rfft(аудиоданные) скаляр = 2**(питч/12) # величина перемещения каждой частоты (высота {-12, 12} полутонов) shiftedFFT = fft # инициализировать массив сдвинутых частот #переносим старую частоту на новую для i в диапазоне (len(fft)): сдвиг_индекс = int (я * скаляр) если сдвиг_индекс < len(fft): сдвинутыйFFT[shift_index] = fft #конвертировать обратно во временной интервал вывод = np.fft.irfft(shiftedFFT) #WAV читает int16, но numpy возвращает комплекс 128, поэтому приведите вывод = вывод.astype('int16') обратный вывод Моя идея заключалась в том, чтобы взять ДПФ сигнала, умножить каждую частоту на желаемую величину, а затем взять обратное ДПФ. При уменьшении звука звук не искажается, как ожидалось. Единственная потеря данных должна быть связана с целочисленным приведением. Однако при повышении высоты тона частоты len(fft) * (1-(1/scalar)) не будут сдвигаться по высоте (если бы они были смещены, они бы вышли за пределы массива). Эта проблема кажется неизбежной. Как эта проблема решается в других алгоритмах изменения высоты тона?
Чтобы лучше понять алгоритмы изменения высоты звука, я пытаюсь написать собственную (по общему признанию упрощенную) программу изменения высоты звука с нуля. audioData — это NDarray, представляющий файл WAV, прочитанный с помощью scipy.io.wavfile.read().
def ChangePitch(self, Pitch, AudioData): # конвертируем аудиосигнал в частотную область с помощью быстрого преобразования Фурье fft = np.fft.rfft(аудиоданные) скаляр = 2**(питч/12) # величина перемещения каждой частоты (высота {-12, 12} полутонов) shiftedFFT = fft # инициализировать массив сдвинутых частот #переносим старую частоту на новую для i в диапазоне (len(fft)): сдвиг_индекс = int (я * скаляр) если сдвиг_индекс < len(fft): сдвинутыйFFT[shift_index] = fft #конвертировать обратно во временной интервал вывод = np.fft.irfft(shiftedFFT) #WAV читает int16, но numpy возвращает комплекс 128, поэтому приведите вывод = вывод.astype('int16') обратный вывод Моя идея заключалась в том, чтобы взять ДПФ сигнала, умножить каждую частоту на желаемую величину, а затем взять обратное ДПФ. При уменьшении звука звук не искажается, как ожидалось. Единственная потеря данных должна быть связана с целочисленным приведением. Однако при повышении высоты тона частоты len(fft) * (1-(1/scalar)) не будут сдвигаться по высоте (если бы они были смещены, они бы вышли за пределы массива). Эта проблема кажется неизбежной. Как эта проблема решается в других алгоритмах изменения высоты тона?
Мобильная версия