Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.5.183] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте ! Занимаясь шумоподавлением для звукового сигнала и применяя покадровую обработку понял что не достаточно хорошо понимаю метод суммирования с перекрытием при восстановлении очищенного от шума сигнала. Хотел бы проконсультироваться, но предварительно опишу то что сам понимаю и надеюсь что выплывут ошибки и недочеты моего понимания. Для шумоподавления я применяю метод спектрального вычитания, что аналогично применению фильтра в спектральной области с некоторой передаточной функцией. То есть очередной кадр с помощью кратковременного преобразования Фурье(с применением взвешивающего окна) преобразуется в спектральную область а дальше производится вычитание усредненного спектра шума и обратное преобразование во временную область. Кадры берутся с некоторым перекрытием. Затем полученный временной кадр очищенного сигнала суммируется с перекрытием с уже ранее очищенным участком сигнала.
Насколько я понимаю данная процедура должна быть технически аналогична ситуации когда имеется входная последовательность квазибесконечная и импульсная характеристика фильтра через который эта последовательность пропускается, достаточно короткая по сравнению с длиной входной последовательности. В этом случае принято применять так называемую секционированную свертку. Она основана на том что входная последовательность обрабатывается блоками. При этом чаще всего применяется алгоритмы свертки с использованием БПФ. То есть циклические свертки. Я нашел в литературе два предлагаемых варианта: (книжка Г. Нуссбаумер Быстрое преобразование Фурье и алгоритмы вычисления сверток) 1. Алгоритм перекрытия с суммированием. 2. Алгоритм перекрытия с накоплением. В первом алгоритме входная последовательность разбивается на смежные (а не перекрывающиеся) блоки и свертка с ИХ фильтра производится при помощи циклического алгоритма свертки при этом последовательности дополняются нулями до некоторого размера N >= N1 + N2 - 1. N1 - длина последовательности, представляющей импульсную характеристику, N2 - длина кадра входной последовательности. Таким образом получаем результат циклической свертки который перекрывается со следующим блоком в N - N2 отсчетах. При суммировании перекрытий получаем результирующую последовательность. Во втором алгоритме блоки изначально берутся перкрывающимися и над каждым блоком выполняется циклическая свертка. Затем первые N - N1 членов циклической свертки отбрасываются а остаются только N - N1 + 1 членов. Здесь никакого суммирования вообще не происходит. То есть последовательность выходная строится из смежных блоков правильных отсчетов. Более того в книге утверждается что этот вариант алгоритма предпочтительнее чем первый. В случае же обработки которую рекомендуют в статьях о шумоподавлении применяется алгоритм блочной обработки который не принадлежит ни к одному из типов обработки, описанных выше. Хотя по идее любая обработка кадра входного сигнала в спектральной области - это применение фильтра с некоторой импульсной характеристикой преобразованной в частотную область (то есть передаточной функцией). И, поскольку длина кадра фиксированная, фиксированной надо полагать и эту самую импульсную характеристику. То есть можно применять один из алгоритмов описанных выше?? Но видимо не все так просто. Теперь об оконном преобразовании Фурье и алиасинге. Алиасинг сколько я понимаю - это перетекание высокочастотных компонентов спектра в низкочастотные с отражением от середины при недостаточной частоте дискретизации. (поправьте если не прав) Оконное преобразование применяется для того чтобы в спектр попали частоты из среднего участка кадра и спектр не был бы искажен из за разрыва сигнала на границах блоков ? Я правильно понимаю ? При этом перекрытие как утверждается определяет уровень алиасинга. Вот тут я совершенно плохо понимаю как это взаимосвязано. Буду рад любой информации и подсказке где почитать о подобной обработке блоков с перекрытием. |
Сообщ.
#2
,
|
|
|
SergeiSX
Предлагаю вам сделать подобные сообщения на разных форумах. dsplib.ru electronix.ru dxdy.ru и др. И послушайте ответы. |
Сообщ.
#3
,
|
|
|
Цитата SergeiSX @ Алиасинг сколько я понимаю - это перетекание высокочастотных компонентов спектра в низкочастотные с отражением от середины при недостаточной частоте дискретизации. Нет. От частоты дискретизации он не зависит. const WindowSize=128; //размер окна fd=200; // частота дискретизации Одна синусоида частотой 9.375 гц, другая 9 гц как вы понимаете их спектр должны выглядит как одна и вторая палка. Ближе всего красная, а вот у синей проблема. Вся проблема в том что как говорят Фурье раскладывает на свои частоты. Отсюда и алиасинг. procedure TForm1.Button7Click(Sender: TObject); const WindowSize=128; //число отсчётов fd=200; // частота дискретизации var i:Integer; a,a1,a2,b:TArrayReal; z,z2:TArrayComplex; begin //создаём сигнал SetLength(a,10000); GenSin(a,fd,9.375,0); // копируем блок, для красивого графика +1 элемент SetLength(a1, WindowSize+1); Move(a[0], a1[0], (WindowSize+1)*SizeOf(a[0])); AddArrayInChart(Chart1,a1,4,fd); SetLength(a1, WindowSize); // обрезаем лишний элемент // Вычисляем спектр CopyInRe(z,a1); FFT(z,False); Amp(a2,Z); //do_db(a2); AddArrayInChart(Chart2,a2,$80000000+3,fd); SetLength(a,0); SetLength(a1,0); SetLength(a2,0); SetLength(Z,0); SetLength(a,10000); GenSin(a,fd,9,0); // копируем блок, для красивого графика +1 элемент SetLength(a1, WindowSize+1); Move(a[0], a1[0], (WindowSize+1)*SizeOf(a[0])); AddArrayInChart(Chart1,1,a1,4,fd); SetLength(a1, WindowSize); // обрезаем лишний элемент // Вычисляем спектр CopyInRe(z,a1); FFT(z,False); Amp(a2,Z); //do_db(a2); AddArrayInChart(Chart2,1,a2,$80000000+3,fd); end; Добавлено Откуда берутся ложные частоты? По сути мы сами взяли и не заметили как проделали следующее. Взяли синусоиду. Обрезали на середине периода периодически повторили. А произошло это когда мы подменили преобразование Фурье на ряд Фурье. РЯД ФУРЬЕ РАСКЛАДЫВАЕТ ТОЛЬКО ПЕРИОДИЧЕСКИЕ СИГНАЛЫ. Т.е те которые укладываются в период ряда Фурье. |
Сообщ.
#4
,
|
|
|
Здравствуйте, Pavia! Спасибо Вам за развернутый ответ! Я попытался на других форумах задать этот же вопрос.
Многое становится понятно. Если я правильно понял, интервал исходного сигнала, используемый для преобразования в ряд Фурье, становится периодом этого сигнала с точки зрения ряда Фурье. И возникают искажения на границах интервалов. Они (искажения) проявляются в результате преобразования в виде дополнительных спектральных компонент. В свете этого я правильно понимаю что оконное преобразование призвано уменьшить разрывы на границах блоков? Спектр каждого блока при этом будет отражать только частотные компоненты в центральной части блока. Немножко путанно выражаюсь, извините. У меня есть статья, в которой алиасинг напрямую связыают с частотой дискретизации. Я ее прилагаю. Интересно Ваше мнение. Еще раз огромное Спасибо ! Прикреплённый файлAliasing.zip (34,62 Кбайт, скачиваний: 263) |
Сообщ.
#5
,
|
|
|
SergeiSX
Это популярная литература. Я было право подумал вы знакомы с книгой А.Б.Сергиенко_Цифровая обработка сигналов. Эта книга обязательна к прочтению и изучению. С неё стоит начать изучение обработки сигналов. Цитата Если частота гармонического сигнала больше частоты Найквиста, восстановленный по дискретным отсчетам аналоговый сигнал (как и в предыдущем случае, он показан пунктирной линией) будет также гармоническим, но с иной частотой (рис. 3,3, в), Данный эффект носит название появления ложных частот (aliasing), мы продолжим его рассмотрение в следующем разделе «Спектр дискретного сигнала». При децимации мы наблюдаем ложные частоты, за счёт их переноса. |
Сообщ.
#6
,
|
|
|
Спасибо! Я знаком с этой книгой но внимательно пока что не читал. Обязательно почитаю! А мой вопрос про применение окон - я правильно понимаю зачем нужны окна при кратковременном преобразовании Фурье?
|
Сообщ.
#7
,
|
|
|
SergeiSX
Это да тут у нас мыслисхожи. |
Сообщ.
#8
,
|
|
|
Спасибо!
|