Форум программистов, компьютерный форум, киберфорум
Цифровая обработка сигналов
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/48: Рейтинг темы: голосов - 48, средняя оценка - 4.77
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 224
1

Выделить огибающую сигнала через преобразование Гильберта

04.05.2014, 17:28. Просмотров 8715. Ответов 14
Метки нет (Все метки)

Программа вычисляет спектр сигнала по алгоритму Герцеля и в итоге мы имеем массив Ampl[i], где i- частота, а Ampl[i]- амплитуда сигнала на частоте i. Хочу выделить огибающую этого сигнала. Для этого мне необходимо произвести преобразование Гильберта со спектром этого сигнала. Про преобразование это я начитан, знаю 3 способа его реализации, самым простым считаю сдвиг фазы исходного сигнала на 90 градусов и получение в итоге сопряженного с исходным сигнала. Не могли бы вы подсказать как реализовать на делфи подобный сдвиг и сформировать новый массив сопряженного сигнала?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2014, 17:28
Ответы с готовыми решениями:

Преобразование Гильберта
Здравствуйте, прошу помощи у вас, нужно написать функцию и пример вызова формирования...

Преобразование Гильберта
Здравствуйте. Пытаюсь получить преобразование Гильберта от сигнала cos({\omega}_{0}t+\varphi ), но...

Преобразование Гильберта на tms
есть код написанный под MMX нужно его перевести для TMS помогите пожалуста=) .686 .model flat,...

Специфика построения спектра моего сигнала через преобразование Фурье
Добрый день. Сигнал у квазипериодический и не сложный. Выглядит он вот так: . Файл с...

14
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
04.05.2014, 17:43 2
Преобразователь Гильберта

...вот только Delphi тут ни причем. Либо у вас уже есть готовый алгоритм и затык лишь с реализацией в синтаксисе, выкладывайте.
1
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 224
04.05.2014, 20:03  [ТС] 3
Цитата Сообщение от raxp Посмотреть сообщение
...вот только Delphi тут ни причем. Либо у вас уже есть готовый алгоритм и затык лишь с реализацией в синтаксисе, выкладывайте.
Выкладываю: посчитал спектр по следующему алгоритму
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
begin
  Fs:=u;
 N:= Fs div F * 2;       //Количество отсчетов (размер буфера 882)
 SetLength(B, N-1);
 SetLength(alpha, N-1);
 SetLength(Wr, N-1);
 SetLength(Wi, N-1);
 SetLength(Ampl, N-1);
 
 Frq:=-100;         //Начальная частота равна -100 Гц.
 For i:=0 To N-1 do begin
  k:=Trunc(N*Frq/Fs);             //Определим номер расчетной гармоники
  alpha[i]:=2*cos(2*Pi*(k/N));    //Расчет коэфф. Альфа
  wr[i] := cos(2*Pi*(k/N));       //Поворотный коэфф. реальная часть
  wi[i] := sin(2*Pi*(k/N));       //Поворотный коэфф. мнимая часть
  Frq:=Frq+F;                     //Перейдем на следующую частоту
 end;
//Цикл расчета по частотам от 50 до 10000 Гц с разносом 50 Гц
  For j:=0 to Ns-1 do begin
//Для начала расчета примем B[-1] = B[-2] = 0
   B[0] := buf[0];
   B[1] := buf[1]+alpha[j+1]*B[0];
//Цикл расчета B
    For i:=2 to N-1 do begin
     B[i] := buf[i]+alpha[j+2]*B[i-1]-B[i-2];
    end;
//реальная и мнимая части спектрального отсчета
   Wr[j]:= B[N-1]*wr[j]-B[N-2];
   Wi[j]:= B[N-1]*wi[j];
//Избавимся от минусов
   Re:=Wr[j]*Wr[j];
   Im:=Wi[j]*Wi[j];
//Выделим и отмасштабируем амплитуду гармоники
   Ampl[j]:=(SQRT(Re+Im))/150000;
   If j=0 Then Ampl[j]:=0;
  end;
   For i:=0 to Ns-1 do begin
//  If Ampl[i]<2 Then Ampl[i]:=0.5;
  Chart2.Series[0].AddXY(i*100,Ampl[i]);
end;
Теперь "затык": чтобы получить сопряженный сигнал мне надо умножить через один значения полученного спектра Ampl[i] на частотную характеристику цифрового фильтра Гильберта, а именно умножить на 2/(3.14*k), где k те самые отсчеты через один и затем выполнить ОБПФ. На делфи без ОБПФ это выглядело бы так:

Delphi
1
2
3
4
5
6
7
i:=1;
repeat
Gil[i]:=(Ampl[i]*2)/3.14*i)
i:=i+2
until i>k; // k это кол-во взятых отсчетов в общем в сигнале
end;
//и далее ОБПФ массива Gil[i]
Правилен ли ход мыслей?
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
04.05.2014, 20:33 4
Выкладываю: посчитал спектр по следующему алгоритму
это ни к чему, и так вижу, что расчет Герцеля из РЛ. Вы распишите полный алгоритм получения огибающей. По сути он представляет собой взятое преобразование Гильберта от сигнала, далее от преобразования взятые квадратуры и на основе квадратур получаем амплитуду, которая в каждой точке по времени дает огибающую сигнала.

А если вы хотите вернуть сигнал через ОБПФ, так и делайте через него.
1
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 224
04.05.2014, 21:01  [ТС] 5
Цитата Сообщение от raxp Посмотреть сообщение
А если вы хотите вернуть сигнал через ОБПФ, так и делайте через него.
Так чтобы получить сопряженный сигнал, для последующего взятия квадратур (корень квадратный от суммы квадратов сопряженного по Гильберту и обычного сигнала), надо вычислять ОБПФ после того как умножу спектр сигнала на частотную характеристику фильтра Гильберта. Говоря проще: спектр реального через фильтр Гильберта= спектр сигнала сопряженного по Гильберту; спектр сопряженного сигнала через ОБПФ= сопряженный сигнал, для взятия квадратуры
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
04.05.2014, 21:13 6
...вот я восстановил огибающую из спектра через ОБПФ без всяких гвоздей:
1
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 224
05.05.2014, 01:46  [ТС] 7
Цитата Сообщение от raxp Посмотреть сообщение
...вот я восстановил огибающую из спектра через ОБПФ без всяких гвоздей
Эт круто... но мне нужен этот гвоздь, чтобы убирать несущую в модулированном сигнале в последующем
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
05.05.2014, 07:38 8
...существующие системы ЦОС переносят промодулированный сигнал на промчастоту перед обработкой в АЦП и несущая очень даже хорошо убирается при получении квадратур:


Почитать http://www.chipinfo.ru/literat... 008/2.html
1
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
05.05.2014, 11:43 9
Лучший ответ Сообщение было отмечено raxp как решение

Решение

Цитата Сообщение от Turgenev Посмотреть сообщение
Программа вычисляет спектр сигнала по алгоритму Герцеля и в итоге мы имеем массив Ampl[i], где i- частота, а Ampl[i]- амплитуда сигнала на частоте i. Хочу выделить огибающую этого сигнала. Для этого мне необходимо произвести преобразование Гильберта со спектром этого сигнала.
Странное описание. По теории, если вы собираетесь выделить огибающую через преобразование Гильберта, это должно выглядеть так. Ваша огибающая - действительная часть комплексной огибающей. Комплексная огибающая получается умножением аналитического сигнала на комплексное несущее колебание. Если у вас уже получен спектр сигнала, вы можете сразу получить аналитический сигнал, без явного вычисления преобразования Гильберта. Просто делаете из своего спектра односторонний.
В общем алгоритм схематически может выглядеть так:
1. Умножаем на 2 половину спектра: Spectr(1:end/2) = 2 * Spectr(1:end/2) для сохранения энергии и обнуляем вторую половину:
Spectr(end/2+1:end) = 0
2. Вычисляем обратное преобразование фурье от полученного одностороннего спектра: s = ifft(Spectr), получаем аналитический сигнал
3. Умножаем полученный сигнал на несущую: ComplexEnvelope = s * exp(i*2*pi*CarrierFreq*t), получили комплексную огибающую.
4. берем действительную часть
1
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 224
06.05.2014, 18:36  [ТС] 10
Цитата Сообщение от raxp Посмотреть сообщение
...существующие системы ЦОС переносят промодулированный сигнал на промчастоту перед обработкой в АЦП и несущая очень даже хорошо убирается при получении квадратур:
Я не смогу выполнить это на делфи, знаний и опыта слишком мало, да и мне нужно-то гораздо меньше- лишь произвести демодуляцию самого простого АМ или ЧМ сигнала. Половина сделана- спектр вычисляется, что с ним теперь сделать в программе, чтобы убрать несущую?
Цитата Сообщение от vital792 Посмотреть сообщение
1. Умножаем на 2 половину спектра: Spectr(1:end/2) = 2 * Spectr(1:end/2) для сохранения энергии и обнуляем вторую половину:
Spectr(end/2+1:end) = 0
2. Вычисляем обратное преобразование фурье от полученного одностороннего спектра: s = ifft(Spectr), получаем аналитический сигнал
3. Умножаем полученный сигнал на несущую: ComplexEnvelope = s * exp(i*2*pi*CarrierFreq*t), получили комплексную огибающую.
4. берем действительную часть
Не понял, как мы узнаем несущую (при ЧМ у нас девиация несущей), а потом как умножить действительную и мнимую части аналит сигнала на нее?
0
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
07.05.2014, 11:04 11
Цитата Сообщение от Turgenev Посмотреть сообщение
Не понял, как мы узнаем несущую
Конечно предполагается, что несущая известна, в смысле модулированная частота. Обычно это так, независимо от типа модуляции.
Цитата Сообщение от Turgenev Посмотреть сообщение
а потом как умножить действительную и мнимую части аналит сигнала на нее?
обычное комплексное умножение. Комплексные отсчеты огибающей умножаются на комплексную частоту cos(wt)+i*sin(wt)
1
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 224
07.05.2014, 15:07  [ТС] 12
Цитата Сообщение от vital792 Посмотреть сообщение
Конечно предполагается, что несущая известна, в смысле модулированная частота. Обычно это так, независимо от типа модуляции.
А что происходит в случае ЧМ? Ведь при ЧМ сигнала несущая не постоянная (девиация частоты), в отличии от АМ, где как раз частота постоянна
0
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
07.05.2014, 15:26 13
Цитата Сообщение от Turgenev Посмотреть сообщение
несущая не постоянная
несущая постоянна, вне зависимости от модулируемого параметра. Хоть амплитуду модулируете, хоть частоту, хоть фазу. Только в случае ам требуется выделить амплитудную ошибающую, а в случае угловой модуляции( fm или pm) - фазовую функцию. Только в случае частотной модуляции эту фазовую функцию надо еще продифференцировать.
1
0 / 0 / 1
Регистрация: 14.11.2012
Сообщений: 224
07.05.2014, 15:35  [ТС] 14
Цитата Сообщение от vital792 Посмотреть сообщение
несущая постоянна, вне зависимости от модулируемого параметра. Хоть амплитуду модулируете, хоть частоту, хоть фазу. Только в случае ам требуется выделить амплитудную ошибающую, а в случае угловой модуляции( fm или pm) - фазовую функцию. Только в случае частотной модуляции эту фазовую функцию надо еще продифференцировать.
Ясно, спасибо. Если следовать вашему плану демодуляции, то односторонний спектр у меня уже получен, не подскажете как лучше выполнить обратное преобразование Фурье от полученного массива амплитуд спектральных отсчетов? То есть вот от этого:
Delphi
1
2
3
4
5
6
7
8
//реальная и мнимая части спектрального отсчета
   Wr[j]:= B[N-1]*wr[j]-B[N-2];
   Wi[j]:= B[N-1]*wi[j];
//Избавимся от минусов
   Re:=Wr[j]*Wr[j];
   Im:=Wi[j]*Wi[j];
//Выделим и отмасштабируем амплитуду гармоники
   Ampl[j]:=(SQRT(Re+Im))/150000;
0
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
07.05.2014, 16:42 15
Цитата Сообщение от Turgenev Посмотреть сообщение
как лучше выполнить обратное преобразование Фурье от полученного массива амплитуд спектральных отсчетов?
не нужно считать массив амплитуд. Обнуляете вторую половину спектра, первую умножаете на 2(не трогая первый отсчет) и вычисляете ifft результата. Модуль брать не нужно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2014, 16:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Преобразование звукового сигнала в спектр (Фурье-преобразование)
Доброго времени суток! Мне необходимо преобразовать звуковой файл в спектр, а как и с чего начать...

Выделить максимумы сигнала и записать их в файл
Доброго всем времени суток.У меня возникла проблема. Задача такая-выделить максимумы...

Преобразование сигнала
Добрый день. Стоит задача написания программы на cpp преобразования сигнала из действ. int 16 в...

Как выделить амплитуду и фазу сигнала без огибающей
Имеется сигнал с частотой около 4 Гц, требуется как можно точно вычислить Амплитуду и фазу. Но есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.