Перейти к содержанию
    

olegas

Участник
  • Постов

    5
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Я, наверное, неоптимально представляю, но для N отсчётов ДПФ требуется матрица размером N^2. Взяв по максимуму N=500 получим: 4*N^2=4*500^2/1024=976 КБ. Многовато.
  2. Это хорошая идея, если коэффициент нормировки будет константой для всех вариантов. Ну или хотя бы зависеть только от исходного числа отсчётов (которое не есть степень двойки) и желаемого (степень двойки, например 512). И вот подопытный файл для всех желающих. 1.wav
  3. То, что частоты сдвинуты - не страшно. Гораздо хуже, что амплитуды для двух вариантов для частот 0..4000 Гц не совпадают.
  4. Дело в том, что для распознавания необходим весь спектр, поэтому алгоритм Гёрцеля не подходит. По поводу изменения частоты дискретизации. Для сравнения результатов в MATLAB построено два спектра: – первый (чёрный) – исходный вариант, ДПФ на 348 точки; – второй (красный) – после передискретизации, БПФ на 512 точек. Графики построены в координатах частота – амплитуда. Вот из-за такой разницы алгоритм распознавания ухудшается (значительно увеличивается расстояние даже между одинаковыми словами (примерно в три раза)). Если возможно, применялось бы БПФ. Вот пример кода из MATLAB: y = audioread('1.wav'); N = length(y); T = 30; %Число кадров K = ceil(2*N/(T+1)); %Число отсчётов в кадре Fs = 8000; %Частота дискретизации %Желаемые параметры сигнала Kwant = 512; Nwant = Kwant/2 * (T+1); %Длина всего сигнала, чтобы число отсчётов в кадре было 512 Fswant= Nwant/N * Fs; %Интерполируем Y = interp1(1:N, y, 1:N/Nwant:N, 'linear'); frame1 = y(1:K); fft_frame1 = abs(fft(frame1)); frame1Y = Y(1:Kwant); fft_frame1Y = abs(fft(frame1Y)); fky = 1:Fs/K:Fs; fkY = 1:Fswant/Kwant:Fswant; fft_frame1y = zeros(size(frame1Y)); fft_frame1y(1:K) = fft_frame1; plot(fkY, fft_frame1Y,'r', fkY,fft_frame1y,'k'); xlabel 'частота, Гц'
  5. Всем доброго времени суток! Для реализации распознавания отдельных слов потребовалось вычисление дискретного преобразования Фурье. Быстрое преобразование применить нельзя, поскольку число отсчётов не является степенью двойки (в противном случае ухудшаются результаты работы основного алгоритма). Восстановление сигнала после преобразования не требуется, всё, что нужно от ДПФ - амплитуда и частота. Сейчас вычисляю ДПФ формулами по определению (формулы ниже, плюс ещё вычисление амплитуды). При обработке одного слова требуется выполнить 30 преобразований Фурье. Число отсчётов лежит в пределах 200 - 500 (конкретное значение заранее неизвестно), но одинаковое для всех тридцати преобразований. В результате при реализации такого алгоритма на stm32f417 при частоте 168 МГц и арифметике с 32-битными float эти 30 преобразований (анализ одного произнесённого слова) вычисляются четыре-пять секунд, что составляет большую часть времени всех вычислений (80%). Для вычисления коэффициентов ДПФ и квадратных корней использую функции DSP-ядра этого микроконтроллера (синус, косинус, квадратный корень). И большую часть времени (68%) занимает как раз вычисление этих самых коэффициентов. Как ещё можно ускорить вычисление ДПФ?
×
×
  • Создать...