Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исправление зеркального эффекта у ДПФ, Как это сделать????? 
V
    Опции темы
ivan219
  Дата 11.11.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



Как избавится от зеркального эфекта в ДПФ smile 
PM MAIL ICQ   Вверх
Alexeis
Дата 11.11.2008, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



  Какого еще зеркального эффекта? 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
  Дата 11.11.2008, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



Цитата(Alexeis @  11.11.2008,  21:07 Найти цитируемый пост)
  Какого еще зеркального эффекта? 

С верху как должно быть а снизу получается в итоге: 
user posted image
Применяемый мною код БПФ:
Код

unit fft;
interface
uses Math, Ap, Sysutils;

procedure FastFourierTransform(var a : TReal1DArray; nn : Integer;
 InverseFFT : Boolean);

implementation
uses Unit1;
(*************************************************************************
Быстрое преобразование Фурье

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

В зависимости от переданных параметров, может выполняться
как прямое, так и обратное преобразование.

Входные параметры:
 nn - Число значений функции. Должно быть степенью
   двойки. Алгоритм не проверяет правильность
   переданного значения.
 a - array [0 .. 2*nn-1] of Real
   Значения функции. I-ому значению соответствуют
   элементы a[2*I]  (вещественная  часть)
   и a[2*I+1] (мнимая часть).
 InverseFFT
  - направление преобразования.
   True, если обратное, False, если прямое.
   
Выходные параметры:
 a - результат преобразования. Подробнее см.
   описание на сайте.
*************************************************************************)
procedure FastFourierTransform(var a : TReal1DArray; nn : Integer;
 InverseFFT : Boolean);
var
  Jj, n ,Mmax ,m , j, istep, i, isign: Integer;
  wtemp, wr, wpr, wpi, wi, theta, tempr, tempi: Extended;
begin
 if InverseFFT then isign := -1
 else isign := 1;

 n := 2 * nn;
 j := 1;
 I := 1;
 mmax := 2;
 
 while I <= n do   // Реверс
  begin
   if j > i then
    begin
     tempr := a[j - 1];
     tempi := a[j];
     a[j - 1] := a[i - 1];
     a[j] := a[i];
     a[i - 1] := tempr;
     a[i] := tempi;
    end;
   m := nn;
   while (m >= 2) and (j > m) do
    begin
     j := j - m;
     m := m div 2;
    end;
   j := j + m;
   I := I + 2;
  end;              // Реверс

 while n > mmax do   // FFT
  begin
   istep := 2 * mmax;                 // 4, 8, 16..2 * NN
   theta := 2 * Pi * isign  / mmax;   // Прямое 2 * Pi * (-1) / (2, 4, 8, 16..2 * NN) Обратное 2 * Pi * 1 / (2, 4, 8, 16..2 * NN)
   wpr := -2 * sqr(sin(0.5 * theta)); // Cos(X) - 1
   wpi := sin(theta);                 // Sin(X)
   wr := 1;
   wi := 0;
   M := 1;
   while M <= mmax do
    begin
     for Jj := 0 to (n - m) div istep do
      begin
       i := m + Jj * istep;
       j := i + mmax;
       tempr := wr * a[j - 1] - wi * a[j];
       tempi := wr * a[j] + wi * a[j - 1];
       a[j - 1] := a[i - 1] - tempr;
       a[j] := a[i] - tempi;
       a[i - 1] := a[i - 1] + tempr;
       a[i] := a[i] + tempi;
      end;
     wtemp := wr;
     wr := wr * wpr - wi * wpi + wr;
     wi := wi * wpr + wtemp * wpi + wi;
     M := M + 2;
    end;
   mmax := istep;
  end;                   //FFT

 if InverseFFT then      // Обратное FFT
  for I := 0 to N - 1 do
   a[I] := a[I] / nn; 
end;
end.


Это сообщение отредактировал(а) ivan219 - 11.11.2008, 23:06
PM MAIL ICQ   Вверх
Alexeis
Дата 11.11.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



ivan219, нижняя картинка правильная. Так выглядит правильный модуль комплексного спектра. С ним не нужно бороться, он такой какой должен быть.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
  Дата 11.11.2008, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



Цитата(Alexeis @  11.11.2008,  23:08 Найти цитируемый пост)
он такой какой должен быть

Да но он портит всю картину при выводе этого спектра на экран :(

Как тогда быть smile 
PM MAIL ICQ   Вверх
ivan219
Дата 12.11.2008, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



Всё вопрос за ненадобностью снимается с повестки дня smile
PM MAIL ICQ   Вверх
Alexeis
Дата 12.11.2008, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(ivan219 @  11.11.2008,  22:18 Найти цитируемый пост)
Да но он портит всю картину при выводе этого спектра на экран :(

  Выводи его половину. Все так делают.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
Дата 12.11.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



Цитата(Alexeis @  12.11.2008,  10:28 Найти цитируемый пост)
 Выводи его половину. Все так делают.

Да но тогда мы теряем половину диапазона это для меня не приемлимо!!!
PM MAIL ICQ   Вверх
Alexeis
Дата 12.11.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(ivan219 @  12.11.2008,  13:23 Найти цитируемый пост)
Да но тогда мы теряем половину диапазона это для меня не приемлимо!!!

  ivan219, учи мат часть. Для идентификации волны нужна частота дискретизации в 2 раза выше ее частоты. При частоте выборок 44100 можно определить амплитуду и фазу волн с частотой не превышающий 22050 (в уравнении 2 неизвестных, для решения нужно 2е точки). Если у тебя блок на 44100 выборки, то половина диапазона это 22050 комплексных спектра, максимально теоретически возможное количество. Как бы ты не выкручивался больше не получиться.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
  Дата 12.11.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



Цитата(Alexeis @  12.11.2008,  14:54 Найти цитируемый пост)
учи мат часть

Вот это правильно!!!

Я совсем запутался и неправильно проводил эксперементы или я и сеёчас ошибаюсь smile 

Цитата(Alexeis @  12.11.2008,  14:54 Найти цитируемый пост)
Если у тебя блок на 44100 выборки, то половина диапазона это 22050

Это я в курсе.

Суть непонятного для меня вопроса вот в чём если уменя есть частота дискретизации 44100 то максимальная частота будет 22050 и если я зделаю БПФ с 1024 осчётами то пик этой частоты будет ровно посередине т.е. 511 да? 
Тоесть унас какбы получается диапазон частот от 0-22050 а после фурье мы получим 0-511 отсчётов этих частот т.е. 0 частота будет принадлежать 0 отсчёту а 22050 будет пренадлежать 511 отсчёту я прав???
PM MAIL ICQ   Вверх
Alexeis
Дата 12.11.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(ivan219 @  12.11.2008,  14:54 Найти цитируемый пост)
Суть непонятного для меня вопроса вот в чём если уменя есть частота дискретизации 44100 то максимальная частота будет 22050 и если я зделаю БПФ с 1024 осчётами то пик этой частоты будет ровно посередине т.е. 511 да? 
Тоесть унас какбы получается диапазон частот от 0-22050 а после фурье мы получим 0-511 отсчётов этих частот т.е. 0 частота будет принадлежать 0 отсчёту а 22050 будет пренадлежать 511 отсчёту я прав??? 

  Почти так, единственное в чем я не уверен так это в 511 отсчете. Спектр не совсем симметричный. 0й частоты нет в зеркальном спектре справа, он есть только слева, вместо нулевого там 1й. короч нужно проверить руками smile . Сгенерить волну максимальной частоты и проверить будет ли она в спектре или там все таки 22049.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
  Дата 12.11.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



Ну вот наконецто разобрался smile 

Я то думал что весь спектр от 0 до 22050 это от 0 до 1024 отсчёта.

Да и эксперементы проводил коряво тамже массив в 2 раза больше число отсчётов, а какие данные туда загонять нигде не нашол вот и решил что там должно быть чисто непрерывная синусоида т.е. 
Код

Ar[0] := Sin(1);
Ar[1] := Sin(2);
.
.
.

А на самом деле должно быть так:
Код

Ar[0] := Sin(1);
Ar[1] := Sin(1);
Ar[2] := Sin(2);
Ar[3] := Sin(2);
.
.
.

Тогда всё встаёт на свои места smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0828 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.