реклама на сайте
подробности

 
 
> Преобразование комплексного сигнала в вещественный
RadioWave
сообщение Nov 30 2006, 11:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 12-07-06
Пользователь №: 18 761



Подскажите, пожалуйста, быстрый алгоритм преобразования сигнала, представленного
в квадратурных комплексных отсчетах, в вещественный сигнал.
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 48)
subver
сообщение Nov 30 2006, 13:42
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 4-06-05
Из: Омск
Пользователь №: 5 726



Цитата(RadioWave @ Nov 30 2006, 14:57) *
Подскажите, пожалуйста, быстрый алгоритм преобразования сигнала, представленного
в квадратурных комплексных отсчетах, в вещественный сигнал.


sqrt(I^2+Q^2) ?
Go to the top of the page
 
+Quote Post
_pegas_
сообщение Nov 30 2006, 17:38
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 79
Регистрация: 24-11-04
Пользователь №: 1 220



Цитата(RadioWave @ Nov 30 2006, 11:57) *
Подскажите, пожалуйста, быстрый алгоритм преобразования сигнала, представленного
в квадратурных комплексных отсчетах, в вещественный сигнал.


Вещественный сигнал это реальная часть от комплексной пары. Но обычно комплексный сигнал
децимирован уже в два раза. Так что придется сначала повысить частоту дискретизации до исходного
уровня
Go to the top of the page
 
+Quote Post
subver
сообщение Dec 1 2006, 05:52
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 4-06-05
Из: Омск
Пользователь №: 5 726



Цитата(subver @ Nov 30 2006, 16:42) *
sqrt(I^2+Q^2) ?


Вот это я ступил так ступил smile.gif

всем сорри. smile.gif
Go to the top of the page
 
+Quote Post
Pathfinder
сообщение Dec 1 2006, 14:14
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 275
Регистрация: 29-06-05
Пользователь №: 6 400



Что значит вещественный сигнал?
Если речь о полосовом сигнале, то S(t) = cos(w*t)*I(t) + sin(w*t)*Q(t)
Если речь об амплитуде, то, как верно заметил subver, A(t) = sqrt(I(t)^2+Q(t)^2)
Что касается
Цитата
реальная часть от комплексной пары

Действительная часть комплексного числа, представляющего квадратурную пару - это просто I(t) - синфазная компонента.
Хотя если речь шла об аналитическом сигнале, тут прав _pegas_ - действительная часть - это сам сигнал, а мнимая - сопряжение по Гильберту.


--------------------
ADC / DAC LC Filter Designer — Удобный инструмент проектирования LC-фильтров для ЦАП и АЦП
Go to the top of the page
 
+Quote Post
_pegas_
сообщение Dec 2 2006, 01:48
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 79
Регистрация: 24-11-04
Пользователь №: 1 220



Цитата(Pathfinder @ Dec 1 2006, 14:14) *
Что значит вещественный сигнал?
Если речь о полосовом сигнале, то S(t) = cos(w*t)*I(t) + sin(w*t)*Q(t)
Если речь об амплитуде, то, как верно заметил subver, A(t) = sqrt(I(t)^2+Q(t)^2)
Что касается
Цитата
реальная часть от комплексной пары

Действительная часть комплексного числа, представляющего квадратурную пару - это просто I(t) - синфазная компонента.
Хотя если речь шла об аналитическом сигнале, тут прав _pegas_ - действительная часть - это сам сигнал, а мнимая - сопряжение по Гильберту.


Комплексных представлений существует несколько вариантов. И комплексный ряд фурье можно причислить к таковому. Но полагаю речь шла о врменной области, где наиболее популярна аналитическая форма представления сигнала
Go to the top of the page
 
+Quote Post
729
сообщение Dec 2 2006, 14:54
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 21-10-05
Пользователь №: 9 952



Цитата(RadioWave @ Nov 30 2006, 11:57) *
Подскажите, пожалуйста, быстрый алгоритм преобразования сигнала, представленного
в квадратурных комплексных отсчетах, в вещественный сигнал.


Вы поясните, как и из чего комплексный сигнал получен, и что Вы хотите иметь на выходе в качестве вещественного сигнала. Тогда Вам смогут подсказать.

Распространённый вариант получения квадратур, через Digital Down Converter (DDC), как правило, выдает комплексный сигнал со спектром, сосредоточеным вокруг нулевой частоты. В этом случае самый быстрый алгоритм получения вещественного сигнала описан в мануале на HSP50016 (Intersil). Суть алгоритма - перенос комплексного сигнала на центральную частоту Fs/4 и взятие реальной части. Если всё это расписать, то проще не бывает. Но для этого, как уже упоминали, частота дискретизации должна быть в 2 раза больше полосы комплексного сигнала.
Однако, этот алгоритм в некоторых случаях, для демодуляции SSB например, практически не пригоден, если полученный сигнал нужно прослушивать.

В общем, есть разные варианты. Их выбор зависит от того, что Вы квадратурили, как квадратурили, что нужно иметь на выходе.
Go to the top of the page
 
+Quote Post
RadioWave
сообщение Dec 5 2006, 10:07
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 12-07-06
Пользователь №: 18 761



Цитата(729 @ Dec 2 2006, 14:54) *
Цитата(RadioWave @ Nov 30 2006, 11:57) *

Подскажите, пожалуйста, быстрый алгоритм преобразования сигнала, представленного
в квадратурных комплексных отсчетах, в вещественный сигнал.


Вы поясните, как и из чего комплексный сигнал получен, и что Вы хотите иметь на выходе в качестве вещественного сигнала. Тогда Вам смогут подсказать.

Распространённый вариант получения квадратур, через Digital Down Converter (DDC), как правило, выдает комплексный сигнал со спектром, сосредоточеным вокруг нулевой частоты. В этом случае самый быстрый алгоритм получения вещественного сигнала описан в мануале на HSP50016 (Intersil). Суть алгоритма - перенос комплексного сигнала на центральную частоту Fs/4 и взятие реальной части. Если всё это расписать, то проще не бывает. Но для этого, как уже упоминали, частота дискретизации должна быть в 2 раза больше полосы комплексного сигнала.
Однако, этот алгоритм в некоторых случаях, для демодуляции SSB например, практически не пригоден, если полученный сигнал нужно прослушивать.

В общем, есть разные варианты. Их выбор зависит от того, что Вы квадратурили, как квадратурили, что нужно иметь на выходе.


Спасибо. Похоже, в том мануале, что Вы подсказали, именно то, что нужно.
Go to the top of the page
 
+Quote Post
RadioWave
сообщение Dec 18 2006, 14:46
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 12-07-06
Пользователь №: 18 761



В продолжение моей темы.

Помогите, пожалуйста разобраться с соответствием между passband и baseband представлениями
сигнала. Как из одного можно получить другое?
Применимо к моей задаче, проблема состоит в следующем. Пропуская фазоманипулированный вещественный
сигнал через преобразователь Гильберта, я получаю реальную и мнимую части этого сигнала (сдвинутые на 90 градусов) в passband представлении. Далее, перемножая на несущую, получаю низкочастотную составляющую
(видеосигнал).
Теперь вопрос. Как, имея на входе комплексное представление сигнала в baseband представлении (после смешивания принятого сигнала с гетеродином приемника на промежуточной частоте), далее из него получить низкочастотную составляющую? При простом перемножении на несущую промежуточной частоты получается
ерунда.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 18 2006, 20:53
Сообщение #10


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(RadioWave @ Dec 18 2006, 11:46) *
В продолжение моей темы.

Помогите, пожалуйста разобраться с соответствием между passband и baseband представлениями
сигнала. Как из одного можно получить другое?
Применимо к моей задаче, проблема состоит в следующем. Пропуская фазоманипулированный вещественный
сигнал через преобразователь Гильберта, я получаю реальную и мнимую части этого сигнала (сдвинутые на 90 градусов) в passband представлении. Далее, перемножая на несущую, получаю низкочастотную составляющую
(видеосигнал).
Теперь вопрос. Как, имея на входе комплексное представление сигнала в baseband представлении (после смешивания принятого сигнала с гетеродином приемника на промежуточной частоте), далее из него получить низкочастотную составляющую? При простом перемножении на несущую промежуточной частоты получается
ерунда.

Как-то нечётко вы мысль выражаете, если посмотреть на второй абзац, а потом на третий.

Как я понял, у вас есть квадратурные составляющие сигнала на некоторой частоте. Что вы хотите получить на выходе? Какая у вас модуляция?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 19 2006, 02:52
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(RadioWave @ Dec 18 2006, 14:46) *
Теперь вопрос. Как, имея на входе комплексное представление сигнала в baseband представлении (после смешивания принятого сигнала с гетеродином приемника на промежуточной частоте), далее из него получить низкочастотную составляющую? При простом перемножении на несущую промежуточной частоты получается ерунда.


Если моя телепатия мне подсказывает правильно, то надо умножать не просто на несущую ПЧ, а делать умножение на комплексную экспоненту с частотой несущей, тогда эта несущая будет снесена аккуратно в ноль и не появится никаких побочных компонентов. Да, и на выходе Вы естественно получите опять комплексный сигнал, т.е. квадратуры.
Go to the top of the page
 
+Quote Post
RadioWave
сообщение Dec 19 2006, 10:45
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 12-07-06
Пользователь №: 18 761



Может, я использую неправильно термины, поэтому попытаюсь уточнить. Под passband я подразумеваю
полосовой сигнал, а под baseband - сигнал снесенный в ноль на промежуточной частоте.

На гетеродин множу не я, а приемник. Если это что-то даст, то в качестве приемника используется анализатор
спектра Agilent. Там есть возможность сделать небольшую запись сигнала в IQ составляющих.
Go to the top of the page
 
+Quote Post
SM
сообщение Dec 19 2006, 19:43
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(RadioWave @ Dec 19 2006, 10:45) *
Может, я использую неправильно термины, поэтому попытаюсь уточнить. Под passband я подразумеваю
полосовой сигнал, а под baseband - сигнал снесенный в ноль на промежуточной частоте.


А тогда его надо просто демодулировать. Ну а метод выбирать исходя из того, как оно было модулировано в передатчике.
Go to the top of the page
 
+Quote Post
Pathfinder
сообщение Dec 20 2006, 18:48
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 275
Регистрация: 29-06-05
Пользователь №: 6 400



RadioWave,
непонятно какую низкочастотную составляющую вы хотите получить из baseband представления? Baseband - это сигнал в основной полосе, на нулевой частоте (а не на промежуточной) - он уже сам по себе низкочастотный. Причем это представление не обязательно в виде квадратур (например, может быть в виде мгновенной фазы и амплитуды).
Пропуская полосовой сигнал через преобразователь Гильберта, вы получаете квадратурные компоненты сигнала с некоторой ошибкой по частоте и фазе.


--------------------
ADC / DAC LC Filter Designer — Удобный инструмент проектирования LC-фильтров для ЦАП и АЦП
Go to the top of the page
 
+Quote Post
Ykidia
сообщение Apr 3 2009, 14:50
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 3-08-06
Пользователь №: 19 287



Цитата
Распространённый вариант получения квадратур, через Digital Down Converter (DDC), как правило, выдает комплексный сигнал со спектром, сосредоточеным вокруг нулевой частоты. В этом случае самый быстрый алгоритм получения вещественного сигнала описан в мануале на HSP50016 (Intersil). Суть алгоритма - перенос комплексного сигнала на центральную частоту Fs/4 и взятие реальной части. Если всё это расписать, то проще не бывает.

Прошу прощения, как говорится, смотрю в книгу, а вижу... Описанный случай - один-в-один как у меня, однако не могу я понять из написанного в мануале, что конкретно мне необходимо делать для преобразования. Есть массив комплексных значений после вышеуказанной обработки из n элементов, надо получить массив вещественных значений из n*2 элементов. Частота вещественного сигнала - 200 MSamples (спектр 0..100 МГц), соответственно комплексного - 100 MSamples (-50..50 МГц). Что я должен делать?
Спасибо.
Go to the top of the page
 
+Quote Post
shf_05
сообщение Apr 4 2009, 07:20
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 22-04-08
Из: г. Екатеринбург
Пользователь №: 36 992



Цитата(Ykidia @ Apr 3 2009, 20:50) *
Есть массив комплексных значений после вышеуказанной обработки из n элементов, надо получить массив вещественных значений из n*2 элементов

из n элементов не получить 2n элементов.

имхо:
s(t)-физический сигнал
для переноса на несущую необходимо выполнить операцию: s_hi_freq(t)=[s(t)+j*HILBERT(s(t))]*exp(j*Wnes) в идеале получается только реальная составляющая без боковых полос
для переноса на ноль s_lo_freq= s_hi_freq(t)*exp(-j*(Wnes+delta))= I+Q, получим т.наз. комплексную огибающую сигнала s_hi_freq(t), спектр такого колебания совпадает со спектром s(t)
с точностю delta
в итоге если надо получить ту же частоту с точн до 0, то исп фапч и соотв сигнал (пилот)
если важна ампл., то sqrt(i^+q^2)
если сдвиг на delta не принципиален - можно взять или i или q (без разницы)
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Apr 4 2009, 11:21
Сообщение #17


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(Ykidia @ Apr 3 2009, 17:50) *
Есть массив комплексных значений после вышеуказанной обработки из n элементов

какой именно обработки? Выше указали их много...

Цитата(Ykidia @ Apr 3 2009, 17:50) *
...надо получить массив вещественных значений из n*2 элементов. Частота вещественного сигнала - 200 MSamples (спектр 0..100 МГц), соответственно комплексного - 100 MSamples (-50..50 МГц). Что я должен делать?

я делал бы так.

есть n*I, n*Q временных отсчетов.

1) cFFT //получили n*I n*Q в частотной области

2) тупо сдвинули все частотные отсчеты в сторону положительных на 50 MHz. Имеем только положительные отсчеты спектра.

3) дополняем отрицательную часть спектра до 2*n элементов в соответствии с правилами спектра Фурье для действительных последовательностей. Вещественная ось четная симметрия([i]=[N-i]). Мнимая - нечетная симметрия([i]=-[N-i]), "0"-й и "N/2" отсчеты пусты т.е. "0"...

4) RealRFFT //обратное для действительных чисел.

получаем действительную временнУю последовательность для 2*n действительных отсчетов.

Этот блочный алгоритм вполне работоспособен для Real Time. smile.gif
Цитата(Ykidia @ Apr 3 2009, 17:50) *
Спасибо.

неее...давайте 50$... biggrin.gif

P.S.: временнОй метод с преобразованием Гильберта тоже проканает, при отвратительном результате для "0"-й частоты. Просто мне частотные методы "ближе"...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
729
сообщение Apr 4 2009, 13:08
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 21-10-05
Пользователь №: 9 952



Цитата(Ykidia @ Apr 3 2009, 18:50) *
Прошу прощения, как говорится, смотрю в книгу, а вижу... Описанный случай - один-в-один как у меня, однако не могу я понять из написанного в мануале, что конкретно мне необходимо делать для преобразования. Есть массив комплексных значений после вышеуказанной обработки из n элементов, надо получить массив вещественных значений из n*2 элементов. Частота вещественного сигнала - 200 MSamples (спектр 0..100 МГц), соответственно комплексного - 100 MSamples (-50..50 МГц). Что я должен делать?
Спасибо.

Сначала надо увеличить частоту дискретизации вдвое. Самый честный способ - вставить между отсчетами сигнала ноль (было x(1), x(2), x(3), ..., стало x(1), 0, x(2), 0, x(3), 0, ...,).
Затем обе квадратуры надо пропустить через ФНЧ с полосой пропускания Fs (Fs - частота дискретизации до вставления нулей).
Понятен ли этот момент? Без понимания сего дальше будет трудно. Если не совсем понятен, то напишите.

Сообщение отредактировал 729 - Apr 4 2009, 13:37
Go to the top of the page
 
+Quote Post
Ykidia
сообщение Apr 6 2009, 01:32
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 3-08-06
Пользователь №: 19 287



Цитата
какой именно обработки? Выше указали их много...

Я имел в виде эту обработку:
Цитата
Распространённый вариант получения квадратур, через Digital Down Converter (DDC), как правило, выдает комплексный сигнал со спектром, сосредоточеным вокруг нулевой частоты. В этом случае самый быстрый алгоритм получения вещественного сигнала описан в мануале на HSP50016 (Intersil). Суть алгоритма - перенос комплексного сигнала на центральную частоту Fs/4 и взятие реальной части. Если всё это расписать, то проще не бывает

Именно о ней шла речь с отсылом к мануалу HSP50016, в котором раздел Quadrature to real мне как следует и непонятен.

DRUID3
Вариант сделать это через FFT туда-сюда, к сожалению, мне не подходит из-за специфично написанного приложения, в котором я ковыряюсь, чтобы добавить в него поддержку комплексного сигнала с платы АЦП.

729
Цитата
Затем обе квадратуры надо пропустить через ФНЧ с полосой пропускания Fs (Fs - частота дискретизации до вставления нулей).
Понятен ли этот момент? Без понимания сего дальше будет трудно. Если не совсем понятен, то напишите.

Извиняюсь, но и в самом деле не совсем понятен...
Go to the top of the page
 
+Quote Post
Ykidia
сообщение Apr 6 2009, 15:22
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 3-08-06
Пользователь №: 19 287



Поясните, пожалуйста, подробнее, если можно.
Go to the top of the page
 
+Quote Post
729
сообщение Apr 6 2009, 15:23
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 21-10-05
Пользователь №: 9 952



Цитата(Ykidia @ Apr 6 2009, 05:32) *
729

Извиняюсь, но и в самом деле не совсем понятен...

После вставления нулей удваивается частота дискретизации. В частотной области получится повторение исходного спектра на частотах Fs-2Fs (Fs частота дискретизации до вставления нулей), то есть был просто спектр в полосе 0-Fs, стало два одинаковых спектра в полосах 0-Fs и Fs-2Fs (с точностью до множителя). Теперь надо то, что на интервале Fs/2-3Fs/2, отфильтровать.
Если не совсем понятно, то спрашивайте.

Сообщение отредактировал 729 - Apr 6 2009, 15:25
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 6 2009, 17:24
Сообщение #22


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(DRUID3 @ Apr 4 2009, 10:21) *
тупо сдвинули все частотные отсчеты в сторону положительных на 50 MHz. Имеем только положительные отсчеты спектра

Не имеем. Отсчёты тупо вдвинутся с отрицательной стороны(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
leksa
сообщение Apr 6 2009, 18:58
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 20-09-08
Пользователь №: 40 352



Пример в помощь cool.gif (обсуждаемый алгоритм на языке матлаба):
Прикрепленный файл  C2R_signal_convert.rar ( 529 байт ) Кол-во скачиваний: 200


Правда в моем примере фильтр взят КИХ на 512 отсчетов произвольно, и при фильтрации он фильтрует все отсчеты, в том числе и нулевые входные, так как используется стандартная функция фильтрации матлаба. Если его заменить на фильтр, который не будет использовать при фильтрации нулевые входные отсчеты, а также подобрать длину его ИХ, исходя из требований к допустимому уровню наложения спектров, то можно получить дополнительный выигрыш производительности.

Почему это работает:
Если есть комплексная огибающая c(t)=I(t)+jQ(t), из нее можно получить реальный сигнал следующей операцией:
g(t)=real{c(t)*exp(j*2*pi*fc*t)}=
=real{I(t)*cos(2*pi*fc*t)+jQ(t)*cos(2*pi*fc*t)+jI(t)*sin(2*pi*fc*t)+j*j*Q(
t)*sin(2*pi*fc*t)}=
=I(t)*cos(2*pi*fc*t)-Q(t)*sin(2*pi*fc*t)
В нашем случае fc=fs/4, при этом cos(2*pi*fc*t) принимает значения 1 0 -1 0 и далее повторяется, а sin(2*pi*fc*t) принимает значения 0 1 0 -1.
Вот и получается что выходной сигнал равен [I(0) -Q(1) -I(2) Q(3) ...] и так далее.
А повышение частоты дискретизации и фильтрация нужны для того чтобы избежать наложения спектра после умножения на комплексную экспоненту и перехода к реальному сигналу.

Отредактировал, "описки" поправил вроде все...

Сообщение отредактировал leksa - Apr 6 2009, 19:39


--------------------
A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away (Antoine de Saint-Exupery)
Go to the top of the page
 
+Quote Post
qxov
сообщение Apr 7 2009, 06:46
Сообщение #24


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 22-03-07
Из: Санкт-Петербург
Пользователь №: 26 406



Не вполне понятно, зачем это нужно. Быть может, более подробное описание проблемы в целом позволит найти элегантное её решение. Не исключено, что изначально выбран не самый лучший путь решения и лучше работать с комплексным сигналом?
Go to the top of the page
 
+Quote Post
Ykidia
сообщение Apr 8 2009, 15:59
Сообщение #25


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 3-08-06
Пользователь №: 19 287



С комплексными числами работаю при отображении спектра и вычислении всяких параметров. А для отображения на осциллоскопе хотелось бы иметь вещественные отсчеты (т.к. программа изначально была разработана для вещественного сигнала, потому и хочется при работе с платой АЦП, выдающей комплексные отсчеты, рисовать осциллоскоп, как и раньше).
Цитата
Вот и получается что выходной сигнал равен [I(0) -Q(1) -I(2) Q(3) ...] и так далее.

Т.е. вещественных отсчетов получается не в 2 раза больше, а столько же, сколько и комплексных? Я думал, что, если у меня 32-битные комплексные отсчеты (по 16 бит на I и Q), то итоговая вещественная последовательность по 16 бит займет столько же байт? Где я неправильно понял?
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Apr 8 2009, 16:06
Сообщение #26


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(=GM= @ Apr 6 2009, 20:24) *
Не имеем. Отсчёты тупо вдвинутся с отрицательной стороны(:-).

??? wacko.gif куда если массив становится в 2-а раза больше?

Цитата(Ykidia @ Apr 8 2009, 18:59) *
С комплексными числами работаю при отображении спектра и вычислении всяких параметров. А для отображения на осциллоскопе хотелось бы иметь вещественные отсчеты (т.к. программа изначально была разработана для вещественного сигнала, потому и хочется при работе с платой АЦП, выдающей комплексные отсчеты, рисовать осциллоскоп, как и раньше).

Раз Вы выводите спектр - то уже работаете по-блочно. Что мешает применить предложенный мной способ!? 07.gif


Цитата(Ykidia @ Apr 8 2009, 18:59) *
Т.е. вещественных отсчетов получается не в 2 раза больше, а столько же, сколько и комплексных? Я думал, что, если у меня 32-битные комплексные отсчеты (по 16 бит на I и Q), то итоговая вещественная последовательность по 16 бит займет столько же байт? Где я неправильно понял?

все верно Вы поняли...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
Ykidia
сообщение Apr 8 2009, 16:28
Сообщение #27


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 3-08-06
Пользователь №: 19 287



Цитата
все верно Вы поняли...

Я про вышеописанное:
Цитата
Вот и получается что выходной сигнал равен [I(0) -Q(1) -I(2) Q(3) ...] и так далее.

Тут получается в 2 раза меньше байт?

Цитата
Раз Вы выводите спектр - то уже работаете по-блочно. Что мешает применить предложенный мной способ!?

Если Вы про FFT туда-сюда, то дело вот в чем. В приложении сделано так, что перед тем как делается вывод спектра, ожидается вывод осциллоскопа :-D, а предложенный Вами способ предполагает наоборот, значит, мне надо копаться и дергать за веревочки, а там где я работаю едва ли понимают, что такое копание в чужом коде и сколько на это может требоваться времени. Тем более нежелательно в результате дополнительного копания что-нибудь сломать, а это иногда бывает smile.gif, тогда приходится чинить и т.д.
Go to the top of the page
 
+Quote Post
Serg76
сообщение Apr 8 2009, 16:52
Сообщение #28


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Цитата(qxov @ Apr 7 2009, 10:46) *
Не вполне понятно, зачем это нужно. Быть может, более подробное описание проблемы в целом позволит найти элегантное её решение. Не исключено, что изначально выбран не самый лучший путь решения и лучше работать с комплексным сигналом?

С комплексным сигналом однозначно работать лучше
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Apr 8 2009, 17:08
Сообщение #29


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(Ykidia @ Apr 8 2009, 19:28) *
Я про вышеописанное:
...
Тут получается в 2 раза меньше байт?

Нужно думать не про байты, а про принцип. Сдвигу в частотной области соответствует умножение на комплексную экспоненту, leksa чертовски прав!!! Это кстати принцип написания алгоритма RealFFT, может кто не знал smile.gif . Но двигать то надо на Fs/2. Потому откуда там у него "0"-ли я тоже не догнал. Мож он перепутал со случаем когда частота дискретизации в 4-е раза выше макимальной частоты сигнала?

Цитата(Serg76 @ Apr 8 2009, 19:52) *
С комплексным сигналом однозначно работать лучше

...когда ты мастер рукопашного боя, то тебе легко убивать и табуреткой smile.gif ...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
Serg76
сообщение Apr 8 2009, 17:20
Сообщение #30


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Цитата(DRUID3 @ Apr 8 2009, 21:08) *
...когда ты мастер рукопашного боя, то тебе легко убивать и табуреткой smile.gif ...

Я сказал это не применительно к этой задаче, а в общем rolleyes.gif
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Apr 8 2009, 17:21
Сообщение #31


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(Serg76 @ Apr 8 2009, 20:20) *
Я сказал это не применительно к этой задаче, а в общем rolleyes.gif

biggrin.gif да я тоже просто "профилософствовал" rolleyes.gif ... biggrin.gif ...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
Ykidia
сообщение Apr 8 2009, 18:10
Сообщение #32


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 3-08-06
Пользователь №: 19 287



Цитата
Нужно думать не про байты, а про принцип

Про байты я говорил для внесения однозначности smile.gif
Цитата
Но двигать то надо на Fs/2. Потому откуда там у него "0"-ли я тоже не догнал. Мож он перепутал со случаем когда частота дискретизации в 4-е раза выше макимальной частоты сигнала?

АЦП оцифровывает на частоте 200 МГц (Fs), т.е. имеем спектр от 0 до 100 МГц (Fs/2). Далее оцифрованный сигнал прогоняется через DDC, где все добро сдвигается на -50 МГц (-Fs/4), делается еще кое-какая обработка, так что имеем спектр от -50 до 50 МГц. Комплексные отсчеты выдаются уже в PC, где через драйвер приложение получает эти комплексные данные в виде I1,Q1,I2,Q2,I3,Q3..., разрядность каждого I и Q - 16 бит, вместе они составляют 32 бита (а на старой плате АЦП были вещественные отсчеты 16 бит).
Приложение, кроме всего прочего, рисует осциллоскоп и спектр. Со спектром все легко - отFFTил полученные данные, вычислил power на каждую полосу и нарисовал. С осциллоскопом аналогично, в принципе сейчас одним цветом рисуется вещественная часть, а другим - мнимая. Но это временная "затычка", хочется отображать полноценный вещественный сигнал, восстановленный из комплексного. Для этого нужно сдвинуть спектр сигнала обратно на +50 МГц (Fs/4) и отфильтровать.
Хорошо, положим на байты, они и в самом деле не при чем, будем считать элементами по 16 бит. Возьмем 8 отсчетов. Как я понял из объяснений выше:
- имеем 16 элементов:
I0, Q0, I1, Q1, I2, Q2, I3, Q3, I4, Q4, I5, Q5, I6, Q6, I7, Q7;
- искусственно повышаем частоту дискретизации:
I0, Q0, 0, 0, I1, Q1, 0, 0, I2, Q2, 0, 0, I3, Q3, 0, 0, I4, Q4, 0, 0, I5, Q5, 0, 0, I6, Q6, 0, 0, I7, Q7, 0, 0;
- далее что-то делаем (умножаем на комплексную экспоненту) и получаем итого тоже 16 элементов:
R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15;
- а по описанному выше - итого лишь 8 элементов?
R0=I0, R1=-Q1, R2=-I2, R3=Q3, R4=I4, R5=-Q5, R6=-I6, R7=Q7.
Поясните, пожалуйста, где противоречие. Понимаю, что надоел уже своей тупизной, но подробно спросить мне вроде как не у кого - в компании либо все заняты, либо только один человек может объяснить, но не адаптированно для идиотов (т.е. для меня), а на языке, предполагающим мои некоторые знания, которых у меня нет :D
Go to the top of the page
 
+Quote Post
729
сообщение Apr 8 2009, 18:36
Сообщение #33


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 21-10-05
Пользователь №: 9 952



Цитата(Ykidia @ Apr 8 2009, 22:10) *
....., делается еще кое-какая обработка, так что имеем спектр от -50 до 50 МГц.

Очень важный момент - что за обработка делается после сдвига на -50МГц?
И еще вопрос - у Вас на выходе DDC какая частота следования отсчетов?

Цитата(Ykidia @ Apr 8 2009, 22:10) *
Хорошо, положим на байты, они и в самом деле не при чем, будем считать элементами по 16 бит. Возьмем 8 отсчетов. Как я понял из объяснений выше:
- имеем 16 элементов:
I0, Q0, I1, Q1, I2, Q2, I3, Q3, I4, Q4, I5, Q5, I6, Q6, I7, Q7;
- искусственно повышаем частоту дискретизации:
I0, Q0, 0, 0, I1, Q1, 0, 0, I2, Q2, 0, 0, I3, Q3, 0, 0, I4, Q4, 0, 0, I5, Q5, 0, 0, I6, Q6, 0, 0, I7, Q7, 0, 0;

... и получаем уже другую нумерацию отсчетов - их уже 16 комплексных. Вот из них-то и получаются R-итые.
То есть:
I0, Q0, 0, 0, I1, Q1, 0, 0, I2, Q2, 0, 0, I3, Q3, 0, 0, I4, Q4, 0, 0, I5, Q5, 0, 0, I6, Q6, 0, 0, I7, Q7, 0, 0;
после фильтрации превращается в некую
i0, q0, i1, q1, i2, q2, ..., i14, q14, i15, q15.
После умножения на (новую) Fs/4 получим:
R0=i0, R1=-q1, R2=-i2, R3=q3, R4=i4, R5=-q5, R6=-i6, R7=q7, ...
Вот и ответ на вопрос про число байтов там и там - число байтов не изменится (Вы же информацию не потеряли и новой не добавили, с чего им измениться).
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Apr 8 2009, 20:09
Сообщение #34


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Цитата(Ykidia @ Apr 8 2009, 21:10) *
АЦП оцифровывает на частоте 200 МГц (Fs), т.е. имеем спектр от 0 до 100 МГц (Fs/2).

отлично...

Цитата(Ykidia @ Apr 8 2009, 21:10) *
Далее оцифрованный сигнал прогоняется через DDC, где все добро сдвигается на -50 МГц (-Fs/4)

здесь у нас разная траковка. Я имел ввиду Fs для комплексного сигнала. 2*Fsc = Fsr;

Цитата(Ykidia @ Apr 8 2009, 21:10) *
... делается еще кое-какая обработка, так что имеем спектр от -50 до 50 МГц.

Ну и отлично, обратно - точно так же! DDC - это ни что иное как комплексная экспонента. smile.gif Никакого принудительного повышения частоты "0"-ми не должно быть. Просто I и Q отсчеты должны идти по 2-а одинаковых значения подряд - ведь такой сигнал продецимированный обратно в любом порядке должен остаЦЦо прежним. Мы не меняем форму его спектра(функцию) а лишь сужаем его(уменьшаем скорость изменения функции относительно частоты дискретизации). Затем умножение на экспоненту - и результат в той же(проинтерполированной частоттой дискретизации). Итого, было по 8 I и Q отсчетов(Fs по 100MHz). Проинтерполировали - стало 16(Fs по 100MHz). Домножили на экспоненту и сложили каналы так и осталось 16(Fs по 100MHz).

Но это общий случай. Если учесть, что сама тригонометрия для sin(Fs/4) и cos(Fs/4) принимает ряд значений 0, 1, 0, -1 и 1, 0, -1, 0 то можно не интерполировать и не надо слаживать! Просто вставлять I и Q отсчеты друг между дружкой(но про то, что именно "-1" не забывать). Вот хороший иллюстративный материал для раздумий...

Цитата(Ykidia @ Apr 8 2009, 21:10) *
...либо только один человек может объяснить, но не адаптированно для идиотов (т.е. для меня), а на языке, предполагающим мои некоторые знания, которых у меня нет :D

Кто не умеет доходчиово объяснить - не владеет знанием... Ведь только объяснив кому-то что-то раз 10-12 начинаешь понимать сам wink.gif ...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
leksa
сообщение Apr 8 2009, 22:26
Сообщение #35


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 20-09-08
Пользователь №: 40 352



Цитата(Ykidia @ Apr 8 2009, 22:10) *
Про байты я говорил для внесения однозначности smile.gif

АЦП оцифровывает на частоте 200 МГц (Fs), т.е. имеем спектр от 0 до 100 МГц (Fs/2). Далее оцифрованный сигнал прогоняется через DDC, где все добро сдвигается на -50 МГц (-Fs/4), делается еще кое-какая обработка, так что имеем спектр от -50 до 50 МГц. Комплексные отсчеты выдаются уже в PC, где через драйвер приложение получает эти комплексные данные в виде I1,Q1,I2,Q2,I3,Q3..., разрядность каждого I и Q - 16 бит, вместе они составляют 32 бита (а на старой плате АЦП были вещественные отсчеты 16 бит).
Приложение, кроме всего прочего, рисует осциллоскоп и спектр. Со спектром все легко - отFFTил полученные данные, вычислил power на каждую полосу и нарисовал. С осциллоскопом аналогично, в принципе сейчас одним цветом рисуется вещественная часть, а другим - мнимая. Но это временная "затычка", хочется отображать полноценный вещественный сигнал, восстановленный из комплексного. Для этого нужно сдвинуть спектр сигнала обратно на +50 МГц (Fs/4) и отфильтровать.
Хорошо, положим на байты, они и в самом деле не при чем, будем считать элементами по 16 бит. Возьмем 8 отсчетов. Как я понял из объяснений выше:
- имеем 16 элементов:
I0, Q0, I1, Q1, I2, Q2, I3, Q3, I4, Q4, I5, Q5, I6, Q6, I7, Q7;
- искусственно повышаем частоту дискретизации:
I0, Q0, 0, 0, I1, Q1, 0, 0, I2, Q2, 0, 0, I3, Q3, 0, 0, I4, Q4, 0, 0, I5, Q5, 0, 0, I6, Q6, 0, 0, I7, Q7, 0, 0;
- далее что-то делаем (умножаем на комплексную экспоненту) и получаем итого тоже 16 элементов:
R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15;
- а по описанному выше - итого лишь 8 элементов?
R0=I0, R1=-Q1, R2=-I2, R3=Q3, R4=I4, R5=-Q5, R6=-I6, R7=Q7.
Поясните, пожалуйста, где противоречие. Понимаю, что надоел уже своей тупизной, но подробно спросить мне вроде как не у кого - в компании либо все заняты, либо только один человек может объяснить, но не адаптированно для идиотов (т.е. для меня), а на языке, предполагающим мои некоторые знания, которых у меня нет :D

Извините, наверно я в своем предыдущем посте вас запутал. Когда я писал про комплексный сигнал I+jQ, я говорил о сигнале после добавления нулей и фильтрации, как вам 729 уже пояснил.
Смотрите предыдущий пост 729, лучше не объяснить:
Цитата
.. и получаем уже другую нумерацию отсчетов - их уже 16 комплексных. Вот из них-то и получаются R-итые.
То есть:
I0, Q0, 0, 0, I1, Q1, 0, 0, I2, Q2, 0, 0, I3, Q3, 0, 0, I4, Q4, 0, 0, I5, Q5, 0, 0, I6, Q6, 0, 0, I7, Q7, 0, 0;
после фильтрации превращается в некую
i0, q0, i1, q1, i2, q2, ..., i14, q14, i15, q15.
После умножения на (новую) Fs/4 получим:
R0=i0, R1=-q1, R2=-i2, R3=q3, R4=i4, R5=-q5, R6=-i6, R7=q7, ...
Вот и ответ на вопрос про число байтов там и там - число байтов не изменится (Вы же информацию не потеряли и новой не добавили, с чего им измениться).

Еще можете посмотреть приведенный мной выше пример, даже если на матлабе не пишете, его можно читать просто как псевдокод, чтобы понять, как это работает.

Немного "веселых картинок" на тему:
спектр исходного комплексного сигнала:
Прикрепленное изображение

спектр сигнала после вставки нулей, до фильтрации
Прикрепленное изображение

спектр сигнала после фильтрации
Прикрепленное изображение

спектр после умножения на экспоненту и взятия реальной части
Прикрепленное изображение

и что будет, если частоту дискретизации не повышать (нули то есть не вставлять, не фильтровать), а просто перейти к реальному сигналу (то есть умножить на экспоненту и взять реальную часть)

Прикрепленное изображение


Цитата
Никакого принудительного повышения частоты "0"-ми не должно быть. Просто I и Q отсчеты должны идти по 2-а одинаковых значения подряд - ведь такой сигнал продецимированный обратно в любом порядке должен остаЦЦо прежним. Мы не меняем форму его спектра(функцию) а лишь сужаем его(уменьшаем скорость изменения функции относительно частоты дискретизации)

Если я правильно понял, то вы предлагаете из сигнала типа [i1 i2 i3 i4...] сделать сигнал [i1 i1 i2 i2 i3 i3 i4 i4...], как альтернативу вставки нулей?
Но такая операция это тоже самое, что и вставить нули, а потом пропустить через КИХ ФНЧ с ИХ равной h=[1 1]. Но у такого фильтра очень плохая АЧХ.
Вот как будет выглядеть спектр после фильтрации этим фильтром
Прикрепленное изображение

потом все что видно по бокам завернется в полосу полезного сигнала при переходе к реальному сигналу.
Для комплексного сигнала из двух синусов
Прикрепленное изображение

получится реальный сигнал с еще двумя "завернувшимися" синусами
Прикрепленное изображение


с уважением, leksa

Сообщение отредактировал leksa - Apr 8 2009, 22:30


--------------------
A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away (Antoine de Saint-Exupery)
Go to the top of the page
 
+Quote Post
qxov
сообщение Apr 9 2009, 07:05
Сообщение #36


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 22-03-07
Из: Санкт-Петербург
Пользователь №: 26 406



Цитата(Ykidia @ Apr 8 2009, 19:59) *
С комплексными числами работаю при отображении спектра и вычислении всяких параметров. А для отображения на осциллоскопе хотелось бы иметь вещественные отсчеты (т.к. программа изначально была разработана для вещественного сигнала, потому и хочется при работе с платой АЦП, выдающей комплексные отсчеты, рисовать осциллоскоп, как и раньше).

Так выводите два канала - до кучи и наглядней будет.
Go to the top of the page
 
+Quote Post
Ykidia
сообщение Apr 9 2009, 12:30
Сообщение #37


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 3-08-06
Пользователь №: 19 287



729
leksa
DRUID3
За терпение и подробные объяснения очень благодарен. Теперь все "сошлось", да еще и с наглядными картинками smile.gif. Хотелось бы прояснить последний (надеюсь) вопрос.
Цитата
... и получаем уже другую нумерацию отсчетов - их уже 16 комплексных. Вот из них-то и получаются R-итые.
То есть:
I0, Q0, 0, 0, I1, Q1, 0, 0, I2, Q2, 0, 0, I3, Q3, 0, 0, I4, Q4, 0, 0, I5, Q5, 0, 0, I6, Q6, 0, 0, I7, Q7, 0, 0;
после фильтрации превращается в некую
i0, q0, i1, q1, i2, q2, ..., i14, q14, i15, q15.
После умножения на (новую) Fs/4 получим:
R0=i0, R1=-q1, R2=-i2, R3=q3, R4=i4, R5=-q5, R6=-i6, R7=q7, ...
Вот и ответ на вопрос про число байтов там и там - число байтов не изменится (Вы же информацию не потеряли и новой не добавили, с чего им измениться).

Что за фильтрация? Как ее произвести? Я так понимаю, она нужна, чтобы превратить вставки из нулей во что-то более подходящее в контексте имеющегося сигнала?

qxov
Наглядно - может быть, и это пока. Когда появится еще один или более каналов с комплексным выходом, и у каждого надо будет выделять реальную и мнимую части разными цветами, - тогда зарябит в глазах wink.gif. Если честно, у меня уже рябит, только от одного канала с двумя графиками.
Go to the top of the page
 
+Quote Post
leksa
сообщение Apr 9 2009, 15:30
Сообщение #38


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 20-09-08
Пользователь №: 40 352



Цитата(Ykidia @ Apr 9 2009, 16:30) *
Что за фильтрация? Как ее произвести? Я так понимаю, она нужна, чтобы превратить вставки из нулей во что-то более подходящее в контексте имеющегося сигнала?

Если рассматривать во временной области, то да, можно сказать что этот фильтр занимается интерполяцией, то есть те нулевые отсчеты, которые были добавлены в сигнал, после фильтрации станут интерполированными значениями соседних ненулевых отсчетов.
Проще говоря сигнал после фильтра будет гладким, уже без нулей. Но если рассматривать только с такой точки зрения то сложно понять как же выбрать характеристику фильтра.
Поэтому, лучше рассматривать с точки зрения в частотной области.
А с точки зрения частотной области после вставки нулей, но до фильтрации в спектре сигнала появилась копия спектра полезного сигнала, вот эти перечеркнутые составляющие по бокам:
Прикрепленное изображение

Наш фильтр должен эти ложные боковые составляющие "задавить", иначе после взятия реальной части, они завернутся в полосу полезного сигнала, а полезный сигнал сохранить. Полезный сигнал лежит в полосе от -Fs/4 до Fs/4, где Fs - частота дискретизации после добавления нулей, в вашем случае, если не ошибаюсь, Fs будет 200 МГц.
То есть АЧХ фильтра должна давить все частоты за пределами полосы от -Fs/4 до Fs/4, и пропускать частоты в этой полосе от -Fs/4 до Fs/4. Примерно АЧХ я нарисовал красной линией.
А ФЧХ лучше чтобы была линейной.
Тогда нам подойдет ФНЧ с конечной ИХ, то есть нерекурсивный, и симметричными коэффициентами(тогда ФЧХ будет линейна), и частотой среза равной Fs/4.
В матлабе такой фильтр можно рассчитать командой
b = fir1(n,Wn), где n - длина ИХ, Wn нормированная частота среза фильтра задается от 0 до 1, причем единица нормирована к Fs/2.
Так как нам нужен фильтр со срезом Fs/4, то нужно вызвать команду так
b = fir1(n,0.5), а n чем больше возьмете тем лучше фильтр будет давить ненужный частоты, но тем больше вычисления при работе фильтра.
В b матлаб вам вернет значения коэффициентов КИХ фильтра.
Если матлаб нет, то рассчитать КИХ ФНЧ в любом инструменте расчета симметричных КИХ фильтров, какой есть под рукой.
В приципе и КИХ не обязательно, можно и БИХ, главное чтобы это был ФНЧ со срезом Fs/4.
Как-то так.
Осталось только одно замечание. У нас ведь на входе фильтра каждый второй отсчет нулевой, поэтому если взять стандартную реализацию КИХ фильтра, то он будет умножать в ходе вычислений эти нули на свои отсчеты, получившиеся умножением нули складывать с ненулевыми слагаемыми, короче делать лишнюю работу. Но результат будет правильный, так что если время вычислений фильтра не критично, то на это можно и "забить".
А если хочется эти лишние вычисления не делать, то надо использовать полифазный многоскоростной фильтр. Реализации таких фильтров сейчас есть готовые во многих библиотеках для обработки сигналов. О принципе его работы я вряд ли смогу здесь коротко объяснить, так что лучше почитать литературу, коей на эту тему немало.

Сообщение отредактировал leksa - Apr 9 2009, 15:35


--------------------
A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away (Antoine de Saint-Exupery)
Go to the top of the page
 
+Quote Post
otshelnik86
сообщение Apr 9 2009, 17:35
Сообщение #39


Участник
*

Группа: Новичок
Сообщений: 29
Регистрация: 13-03-07
Из: Беларусь, Минск
Пользователь №: 26 099



красивые картинки smile.gif

Сообщение отредактировал otshelnik86 - Apr 9 2009, 17:36


--------------------
"Правильный путь один - СВОЙ"
"Счастье - это не станция назначения, а способ путешествовать."
Go to the top of the page
 
+Quote Post
Ykidia
сообщение Apr 14 2009, 11:02
Сообщение #40


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 3-08-06
Пользователь №: 19 287



Круто. Все понятно, дальше некуда. Большое спасибо за терпение и ясный как день ликбез smile.gif. С фильтром попробую разобраться сам.
Go to the top of the page
 
+Quote Post
pirri
сообщение Sep 9 2009, 09:19
Сообщение #41





Группа: Участник
Сообщений: 7
Регистрация: 17-07-09
Из: Nьrnberg
Пользователь №: 51 349



i'm not sure that my question matches this topic, but:
Hilbert tansformation, FPGA.
i- and q-components are coming to the input separately. As far as i understood i should apply Hilbert filter and delay just to real component. What about q-component?
Here is my Matlab simulation:

L = 26;
h = firpm(L,[0.1 0.9],[1 1],'Hilbert');
h=round(h*256);

x_hil_i=filter(h,1,real(inp));
x_hil_i=x_hil_i/256;

delayfilter = zeros(L,1).';
delayfilter(14) = 1;
inp_del_i= filter(delayfilter,1,real(inp));

b_i1=inp_del_i+1i*x_hil_i;
b_i2=inp_del_i-1i*x_hil_i;


figure; plot (abs(fftshift(fft(b_iA))));
figure; plot (abs(fftshift(fft(b_iB))));
Go to the top of the page
 
+Quote Post
aa.veter
сообщение Aug 23 2010, 07:01
Сообщение #42





Группа: Новичок
Сообщений: 6
Регистрация: 23-08-10
Пользователь №: 59 060



Цитата(DRUID3 @ Apr 4 2009, 15:21) *
какой именно обработки? Выше указали их много...


я делал бы так.

есть n*I, n*Q временных отсчетов.

1) cFFT //получили n*I n*Q в частотной области

2) тупо сдвинули все частотные отсчеты в сторону положительных на 50 MHz. Имеем только положительные отсчеты спектра.

3) дополняем отрицательную часть спектра до 2*n элементов в соответствии с правилами спектра Фурье для действительных последовательностей. Вещественная ось четная симметрия([i]=[N-i]). Мнимая - нечетная симметрия([i]=-[N-i]), "0"-й и "N/2" отсчеты пусты т.е. "0"...

4) RealRFFT //обратное для действительных чисел.

получаем действительную временнУю последовательность для 2*n действительных отсчетов.

Этот блочный алгоритм вполне работоспособен для Real Time. smile.gif

неее...давайте 50$... biggrin.gif

P.S.: временнОй метод с преобразованием Гильберта тоже проканает, при отвратительном результате для "0"-й частоты. Просто мне частотные методы "ближе"...


Вижу, что теме уже год, но уж очень точно попало в мою задачу. Имею 2048 комплексных отсчетов (2048 I и 2048 Q). И так 95 раз в секунду. Что образует частоту дискретизации 196078 Гц. Нужно демодулировать амплитудный сигнал (AM USB) по частоте 1500 Гц (здесь я имею ввиду частоту относительно нулевой - по крайней мере я так понимаю). Здесь сигнал это картинка: наличие сигнала на 1500 Гц это черный пиксел, отсутствие - белый. В идеале получать где-нибудь 4000 пикселей в секунду.

Подойдет ли мне такая реализация? :

Хочу 1) использовать вышеописанный алгоритм преобразования комплексного сигнала в вещественный частотным сдвигом. 2) Далее наверно применять КИХ фильтр для выделения нужной частоты. 3) Затем разделить полученный за секунду вещественный отфильтрованный сигнал на 4000 кусков и каждый кусок сравнивать с прототипом минимальной амплитуды = если выше, то черный, если ниже, то белый.

to DRUID3: есть у меня сомнения, что я правильно понимаю, что такое четная и нечетная симметрия. Если есть массив a, то для четной симметрии в массив b надо записывать b[i] = a[N-i], а для нечетной b[i] = -a[N-i], правильно? и так до i < N/2?

Еще вопрос по RealFFT. Нашел реализацию сей функции по адресу http://algolist.manual.ru/maths/fft.php Там есть функция void RealFFT(real *ddata, ulong Len, int Dir). Здесь Dir означает направление преобразования. Мне же нужно обратное? (для преобразования из частотного представления в сигнал).

Вот, а зачем выше (перед RealFFT) копируем мнимую часть, если преобразование у нас вещественное. Может и копировать есть смысл только вещественную чать?
Go to the top of the page
 
+Quote Post
bahurin
сообщение Aug 24 2010, 04:49
Сообщение #43


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347



Цитата(aa.veter @ Aug 23 2010, 11:01) *
Вижу, что теме уже год, но уж очень точно попало в мою задачу. Имею 2048 комплексных отсчетов (2048 I и 2048 Q). И так 95 раз в секунду. Что образует частоту дискретизации 196078 Гц. Нужно демодулировать амплитудный сигнал (AM USB) по частоте 1500 Гц (здесь я имею ввиду частоту относительно нулевой - по крайней мере я так понимаю). Здесь сигнал это картинка: наличие сигнала на 1500 Гц это черный пиксел, отсутствие - белый. В идеале получать где-нибудь 4000 пикселей в секунду.

Подойдет ли мне такая реализация? :

Хочу 1) использовать вышеописанный алгоритм преобразования комплексного сигнала в вещественный частотным сдвигом. 2) Далее наверно применять КИХ фильтр для выделения нужной частоты. 3) Затем разделить полученный за секунду вещественный отфильтрованный сигнал на 4000 кусков и каждый кусок сравнивать с прототипом минимальной амплитуды = если выше, то черный, если ниже, то белый.


вы имеете квадратуры зачем вам для демодуляции назад вещественный сигнал? Сдвигайте ваш комплексный сигнал на 1500 Гц (т.е. в ноль) и выделяйте амплитудную огибающую

Есть z(t) = I(t)+j *Q(t) нужно сместить на 1500 Гц для этого умножаем на комплексную экспоненту получаем z0(t) = I0(t)+j*Q0(t) = z(t)*exp(-j*2*pi*f0*t), где f0 = 1500 Гц.
Теперь выделяем амплитудную огибающую: A(t) = sqrt(I0(t)^2 + Q0(t)^2). Все амплитудный демодулятор готов никаких фильтров не надо никаких fft.
Go to the top of the page
 
+Quote Post
hobgoblin
сообщение Aug 24 2010, 10:56
Сообщение #44


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 2-10-06
Из: Петербург
Пользователь №: 20 881



Можно еще применить алгоритм CORDIC в режиме вычисления модуля.
Go to the top of the page
 
+Quote Post
aa.veter
сообщение Aug 24 2010, 13:46
Сообщение #45





Группа: Новичок
Сообщений: 6
Регистрация: 23-08-10
Пользователь №: 59 060



Цитата(bahurin @ Aug 24 2010, 08:49) *
вы имеете квадратуры зачем вам для демодуляции назад вещественный сигнал? Сдвигайте ваш комплексный сигнал на 1500 Гц (т.е. в ноль) и выделяйте амплитудную огибающую

Есть z(t) = I(t)+j *Q(t) нужно сместить на 1500 Гц для этого умножаем на комплексную экспоненту получаем z0(t) = I0(t)+j*Q0(t) = z(t)*exp(-j*2*pi*f0*t), где f0 = 1500 Гц.
Теперь выделяем амплитудную огибающую: A(t) = sqrt(I0(t)^2 + Q0(t)^2). Все амплитудный демодулятор готов никаких фильтров не надо никаких fft.


сделал таким образом. И о чудо, вижу картинку! До этого рисовал только на другом сигнале с помощью спектра по Фурье, выбирая там амплитуду на нужной частоте. Брал просто минимально возможное количество выборок. Естественно этого не хватало, так как картинка в таком варианте получается недостаточно детализированной. И я решил двигаться в сторону фильтрации сигнала по нужной частоте и выделению уже из отфильтрованного сигнала амплитуды. Так как у соратника оказалась реализация фильра баттрворта для вещественного сигнала, то решил к такому виду и привести свой сигнал.

Однако этот метод явно лучше! Сразу благодарю! Огромное спасибо! Очень удачная подсказка!

Сейчас получаю 2048 * 95 * 2 пикселей за секунду. Это количество перевожу в 2048*2 за секунду, суммируя каждые 95, ну и делю еще на подобранный интуитивно коэффициент.
Единственное, в идеале должно получаться белое поле с рисунком черными линиями. Сейчас оно от строчки к строчке наверно синусоидально варьируется по яркости, поэтому на каких-то строчках черные линии по белому, на каких-то белые по черному, на каких-то серые на сером (в градациях серого то есть). Чем это может быть вызвано и как привести к желаемой стабильной картинке?

Цитата(hobgoblin @ Aug 24 2010, 14:56) *
Можно еще применить алгоритм CORDIC в режиме вычисления модуля.

что означает в режиме вычисления модуля? Правильно я понял, что CORDIC - это способ упрощенной реализации вышеописанного смещения сигнала?
Go to the top of the page
 
+Quote Post
aa.veter
сообщение Aug 25 2010, 15:03
Сообщение #46





Группа: Новичок
Сообщений: 6
Регистрация: 23-08-10
Пользователь №: 59 060



похоже, амплитуда сдвинутого сигнала равна амплитуде не сдвинутого((
Go to the top of the page
 
+Quote Post
hobgoblin
сообщение Aug 26 2010, 07:13
Сообщение #47


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 2-10-06
Из: Петербург
Пользователь №: 20 881



Цитата(aa.veter @ Aug 24 2010, 17:46) *
что означает в режиме вычисления модуля? Правильно я понял, что CORDIC - это способ упрощенной реализации вышеописанного смещения сигнала?

У кордика есть два режима - режим вычисления модуля (преобразование из декартовой в полярную систему координат) и режим вращения (когда комплексный вектор вращается на заданный угол). В режиме вычисления модуля делается поворот вектора (x,y) таким образом, чтобы составляющая y в итоге была равна нулю. x при этом будет равно модулю вектора, умноженному на константу, зависящую от количества итераций. В режиме вращения вектор поворачивается на указанный угол. Так как Вам нужно просто получить огибающую (модуль комплексного вектора), то проще использовать первый режим. Если бы у Вас была задача по честному снести спектр сигнала на нулевую частоту, то тогда нужно было бы использовать режим вращения, подав на вход угла вращения сигнал от фазового аккумулятора. Инкремент фазового аккумулятора в этом случае должен быть равен -2*IF/Fs, где IF - частота ПЧ, Fs - частота дискретизации.

Go to the top of the page
 
+Quote Post
aa.veter
сообщение Aug 26 2010, 13:18
Сообщение #48





Группа: Новичок
Сообщений: 6
Регистрация: 23-08-10
Пользователь №: 59 060



В общем после сдвига сигнала фильтрую лишние частоты с помощью прямого и обратного фурье. За базис беру первые и последние пять значений в бине спектра из 2048 отсчетов, остальные урезаю, и то же самое с зеркалом бина на следующих 2048. Получается неплохо. Картинка приобретает читабельный характер. Приводит это дело к некоторой вычислительной задержке, но это решаемо использованием более быстрых фильтров, как я понимаю. И если не ошибаюсь, полоски, идущие наискосок картинки, у меня появляются тоже из-за фурье. Так что похоже с этим справились.

Единственный вопрос: количество пикселей в строке у меня отличается от расчетных где-то на десяток. Это из-за того, что сигнал сдвинут относительно нулевой частоты? Если так, то получается когда я буду принимать сигнал на 0-ой частоте, количество пикселей четко будет соответствовать?
Go to the top of the page
 
+Quote Post
aa.veter
сообщение Aug 27 2010, 13:35
Сообщение #49





Группа: Новичок
Сообщений: 6
Регистрация: 23-08-10
Пользователь №: 59 060



Еще: почему мне все-таки приходится фильтровать? я что-то не так делаю? Экспоненту я представляю комплексным числом: exp( 0 + j*2*pi*f0*t ) = exp(0) * ( cos( 2*pi*f0*t ) + j*sin( 2*pi*f0*t ) ), где f0 - частота для сдвига Гц, t - время отсчета, сек.
И сдвиг получаю умножением z0 = z * exp(...). В результате Амплитуда сигнала остается на месте.
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 19:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01911 секунд с 7
ELECTRONIX ©2004-2016