Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не получается цифровой LPF
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
RG29
Есть входной сигнал 5кГц напоминающий треугольник



Хотелось бы из него сделать что-то близкое к синусоиде. Для этого пропускаю его через фильтр НЧ.
Код фильтра был сгенерирован калькулятором ЗДЕСЬ для параметров:
-тип - Баттерворт
-порядок - 4
-сэмплинг - 11025
-частота среза - 5500

Код
#define NZEROS 4
#define NPOLES 4
#define GAIN   1.009351158e+00

static float xv[NZEROS+1], yv[NPOLES+1];

static void filterloop()
  { for (;;)
      { xv[0] = xv[1]; xv[1] = xv[2]; xv[2] = xv[3]; xv[3] = xv[4];
        xv[4] = next input value / GAIN;
        yv[0] = yv[1]; yv[1] = yv[2]; yv[2] = yv[3]; yv[3] = yv[4];
        yv[4] =   (xv[0] + xv[4]) + 4 * (xv[1] + xv[3]) + 6 * xv[2]
                     + ( -0.9815567827 * yv[0]) + ( -3.9444991525 * yv[1])
                     + ( -5.9443270236 * yv[2]) + ( -3.9813846512 * yv[3]);
        next output value = yv[4];
      }
  }

Перевёл код в Матлаб



Но результат не понятен (верх - исходный,низ - результат):



Почему не получилась синусоида?
Я не правильно применил фильтр?
Я ошибся в коде Матлаба?
Tpeck
Цитата(RG29 @ Feb 19 2018, 11:10) *
Есть входной сигнал 5кГц напоминающий треугольник

Ключевое слово - напоминающий треугольник.
Теорема Котельникова Вам знакома?
RG29
Я так предполагал, что мой фильтр срежет все высокочастотные составляющие и сигнал сгладится, станет более похож на синус, но сглаживания нет. Вы намекаете, что мой исходный сигнал не содержит гармоник выше 5500Гц, поэтому фильтр не работает?
Lmx2315
.
RG29
Не пойму за отсчёты. Исходный сигнал получен с АЦП оцифровкой сигнала 5000 Гц с частотой семплирования 11025 Гц. Где не соответствие Котельникову?
Lmx2315
Цитата(RG29 @ Feb 19 2018, 11:58) *
Не пойму за отсчёты. Исходный сигнал получен с АЦП оцифровкой сигнала 5000 Гц с частотой семплирования 11025 Гц. Где не соответствие Котельникову?

У вас на входе АЦП нет аналогового фильтра который пропускает только сигналы с частотой до 5 Кгц ?
Если нет - то вы наблюдаете Альясинг , ваш сигнал испорчен и востановлению не подлежит.
RG29
Само собой, фильтр есть.
Почему испорчен, частота 5КГц, сэмплинг 11КГц, разве не нормальный вид для такого количества выборок?
Почему не подлежит, почему ФНЧ не сможет сгладить гармоники выше 5КГц?
ViKo
А цифры 0, 2, 4, 6 ... по X на графиках - это что?
С Котельниковым у вас все нормально. Или нет? Нужно же весь спектр сигнала пропустить.
Да, вы передаете гармоники сигнала из других зон периодического цифрового фильтра.
Tpeck
Цитата(RG29 @ Feb 19 2018, 11:58) *
Не пойму за отсчёты. Исходный сигнал получен с АЦП оцифровкой сигнала 5000 Гц с частотой семплирования 11025 Гц. Где не соответствие Котельникову?


И какой сигнал можно оцифровать с такой частотой дискретизации?
Когда у вас, чуть более, чем два отсчета на период?

Цитата(RG29 @ Feb 19 2018, 12:12) *
Почему не подлежит, почему ФНЧ не сможет сгладить гармоники выше 5КГц?

А какие гармоники, по Вашему мнению, там присутствуют?
Можете частоты привести?
RG29
Попробовал построить спектр сигнала:



Получается, при такой частоте семплирования в цифровых данных сигнале не достаточно информации о высших гармониках, и поэтому, как написал Lmx2315, оцифрованный сигнал как бы повреждён и не может быть восстановлен до исходной синусоиды. Верно?
Lmx2315
Автор нарисовал треугольник из входных отчётов , а на самом деле у него синусоида с двумя , с небольшим , отчётами на период . -никакого треугольника там быть не может .
По этому и после фильтра у него тоже самое . Линии что он соеденил отчёты - несуществующие , прямо скажем - ошибочные в данном случае абстракции.
У треугольного сигнала бесконечный спектр гармоник , а они не могли пролезть через входной фильтр.

з.ы.
спектр как мы видим правильный - постоянная составляющая и маленькая синусоидальная гармоника на 5 кгц , а не треугольник.
ViKo
На 15 кГц третья гармоника покажется, если расширить график спектра. И т.д.
andyp
Цитата(RG29 @ Feb 19 2018, 12:31) *
Получается, при такой частоте семплирования в цифровых данных сигнале не достаточно информации о высших гармониках, и поэтому, как написал Lmx2315, оцифрованный сигнал как бы повреждён и не может быть восстановлен до исходной синусоиды. Верно?


Спектр треугольника содержит нечетные гармоники фундаментальной частоты (в Вашем случае еще и постоянку), амплитуда которых убывает как квадрат их номера. Для того, чтобы синтезировать более-менее нормальны треугольник нужно взять хотя бы 5 гармоник (см https://en.wikipedia.org/wiki/Triangle_wave). Это даст полосу сигнала равную 10*(1/Период). Соответственно, для дискретизации такого сигнала требуется примерно 20-ти кратная частота дискретизации.
RG29
Вот теперь (кажется) понял, спасибо 08.gif
Тогда такой вопрос - можно как-то исправить искажения из-за низкой частоты семплирования программно?
Realking
Цитата(RG29 @ Feb 19 2018, 12:53) *
Вот теперь (кажется) понял, спасибо 08.gif
Тогда такой вопрос - можно как-то исправить искажения из-за низкой частоты семплирования программно?


Цель то всего этого? не понятно..

Или показать кому то наглядно надо? ))

и еще.. как уже было сказано выше, это не искажения...


RG29
Цитата(andyp @ Feb 19 2018, 12:52) *
Спектр треугольника содержит нечетные гармоники фундаментальной частоты (в Вашем случае еще и постоянку), амплитуда которых убывает как квадрат их номера. Для того, чтобы синтезировать более-менее нормальны треугольник нужно взять хотя бы 5 гармоник (см https://en.wikipedia.org/wiki/Triangle_wave). Это даст полосу сигнала равную 10*(1/Период). Соответственно, для дискретизации такого сигнала требуется примерно 20-ти кратная частота дискретизации.

Чисто из интереса, то есть, если я руками допишу по 20 промежуточных точек в исходные данные и в расчёт фильтра поставлю новую частоту 220500, то фильтр отработает как надо и на выходе получится синусоида?




Цитата(Realking @ Feb 19 2018, 13:00) *
Цель то всего этого? не понятно..

Или показать кому то наглядно надо? ))

и еще.. как уже было сказано выше, это не искажения...

Цель проста - постижение науки ЦОС rolleyes.gif
Realking
Цитата(RG29 @ Feb 19 2018, 13:05) *
Чисто из интереса, то есть, если я руками допишу по 20 промежуточных точек в исходные данные и в расчёт фильтра поставлю новую частоту 220500, то фильтр отработает как надо и на выходе получится синусоида?




)))
да не треугольник у Вас

но если допишите, то да - треугольник

но и фильтровать (гасить) вы должны от 10 кГц и выше


andyp
Цитата(RG29 @ Feb 19 2018, 12:53) *
Тогда такой вопрос - можно как-то исправить искажения из-за низкой частоты семплирования программно?


Что значит исправить?

В лучшем случае удастся отфильтровать те гармоники, которые завернулись в полосу сигнала при дискретизации. Только проще сразу формировать сигнал как сумму гармоник, которые укладываются в половину частоты дискретизации. Среднеквадратическая ошибка в этом случае будет минимальна.
Realking
Цитата(RG29 @ Feb 19 2018, 13:09) *
Чисто из интереса, то есть, если я руками допишу по 20 промежуточных точек в исходные данные и в расчёт фильтра поставлю новую частоту 220500, то фильтр отработает как надо и на выходе получится синусоида?





Цель проста - постижение науки ЦОС rolleyes.gif


Fs = 220500;
t = (0:250)/Fs;

tri = sawtooth(2 * pi * 5000 * t, 0.5);

windowSize = 15;
b = (1 / windowSize)*ones(1,windowSize);
a = 1;

out = filter(b,a,tri);

plot(tri);
hold on;
plot(out);

грубый пример (фильтр однородный)

поставьте Fs = 10000;
и увидите первоначальную свою картинку )
RG29
Сделал как описано выше. Всё работает, как и должно rolleyes.gif

Тему можно закрывать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.