LINUX.ORG.RU

Посоветуйте алгоритмы ресамплинга сигнала в 2^N раз

 , fir, resampling


0

1

Хочется на чахлом микроконтроллере даунсамплить сигнал, чтобы повысить разрешение FFT в нижних частотах.

Сориентируйте, куда копать. Что-то кроме децимирующего FIR есть смысл искать?

И второй вопрос - если FIR, то с какими параметрами?

  • Меня смущает, что частоту среза выставляют ровно на половине диапазона, а не слегка ниже. Разве от недодавленного края переотражения на FFT не полезут?
  • Какое подавление выбирать? 40дб? 60дб?
★★★★★

Ответ на: комментарий от Morin

Там уровень «скетчей для ардуины». А я хочу нюансы понять - с какими параметрами фильтр синтезировать.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Посоветуйте алгоритмы ресамплинга сигнала в 2^N раз

Ты точно разбираешься в том о чем пишешь?

Какой же гнидой надо быть, чтобы по сути отвечающему тебе человеку написать такое. А что, бл*ять, тебя не устроило-то?

anonymous
()
Ответ на: комментарий от Vit

У меня есть книжка по цифровым фильтрам, скорее всего ты её читал, но если хочешь то могу поискать.

torvn77 ★★★★★
()
Ответ на: комментарий от anonymous

Смотри, вот у тебя два пять семплов: 0, max, max/2, max и опять 0.

У тебя будет нечто вроде 0 , 2/3max, 0 , а ему скажем надо 0, max, 0 при том чтобы скажем в других случаях происходило усреднение.

В общем усреднение то усреднение, но болльшая или меньшая половина, или строго попалам?

torvn77 ★★★★★
()
Ответ на: комментарий от torvn77

Ну а этот max он точно относится к нижней частоте или может это какой-то высокочастотный всплеск, который додик и хочет отфильтровать? На разрешение в итоге это даже и не повлияет. На точность, возможно, но в контексте «чахлого МК» это как бы и не важно.

Но придирка моя была не к сути ответа, а к тому, как это чучело отвечает людям. Ну не подошёл тебе ответ — не отвечай или скажи «спасибо, мне это не подходит». Но нет, бл*ять, надо под кожу залезть и обязательно что-то гадкое сказать. И в каждой его теме так. Он точно психически здоров, этот ваш @Vit?

anonymous
()
Ответ на: комментарий от torvn77

Если честно, то я не понял, нахрена вообще фильтровать для того, чтобы повысить разрешение FFT. Для повышения разрешения по частоте надо увеличивать размер буфера либо уменьшать частоту семплирования. Никаким фильтром ты из отсутствующего сигнала не вытянешь результат. Или я не прав?

anonymous
()
Ответ на: комментарий от torvn77

Нет, будет 0.5*max, 0.75*max (всего два, для третьего не хватит ещё пары). Разумеется, исходная закономерность будет в конец потеряна, но по-другому быть не могло - там частота на грани разрешения, а мы его порезали в 2 раза. А дополнительные низкочастотные данные мы можем только выдумать (только зачем?).

firkax ★★★★★
()
Ответ на: комментарий от Vit

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

peregrine ★★★★★
()

Что-то кроме децимирующего FIR есть смысл искать?

Децимирующий CIC. Умножители не нужны будут.

ox55ff ★★★★★
()

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

Про выбор частоты среза здесь есть. Раздел «Использование CIC-фильтра при децимации сигналов».

ox55ff ★★★★★
()

вот такой вариант, может сгодится … псевдо-си:

float signal_even = 0;
float signal_even_z0 = 0;
float signal_odd = 0;
float signal_odd_z0 = 0;
float signal_odd_z1 = 0;
float signal_odd_z2 = 0;
float signal_odd_z3 = 0;
int count = 0;


// сюда подать сигнал для доунсемплинга
// это выполняется на каждый семпл...
float downsampled(float signal)
{
  float buf, buf0, buf1, buf2, buf3;

  // Even
  if (count == 0)
	{
	  count = 1;

	  out = (signal_even_z0 + signal_odd) * 0.5;
	  signal_even = signal_even_z0;
	  signal_even_z0 = signal;
	}
  // Odd
  else
	{
	  count = 0;

	  signal_odd_z3 = signal_odd_z2; 
	  signal_odd_z2 = signal_odd_z1; 
	  signal_odd_z1 = signal_odd_z0; 
	  signal_odd_z0 = signal; 
	  
	  // interpolation 4-point
	  buf0 = (signal_odd_z2 - signal_odd_z0) * 0.5;					
	  buf1 = signal_odd_z1 - signal_odd_z2;						
	  buf2 = buf0 + buf1;					
	  buf3 = ((signal_odd_z3 - signal_odd_z1) * 0.5) + buf2 + buf1;		
	  buf = (((((0.5 * buf3) - (buf2 + buf3)) * 0.5) + buf0) * 0.5) + signal_odd_z1;

	  signal_odd = buf;
	  out = (buf + signal_even) * 0.5;
	}

  return (out);
}

// когда count == 0  или count == 1, можно забирать out, 
// там поидее доунсемпленное значение
// а вообще хз, я непроверял.
nioelumiijke
()
Ответ на: комментарий от ox55ff

Я правильно понимаю, что тут есть компромисс: либо у тебя оригинальный сигнал и возможный алиасинг, либо у тебя «каша со вкусом мыла» и чуть меньше алиасинга?

anonymous
()
Ответ на: комментарий от ox55ff

Пишут что у CIC всплески большие. Он точно годится для последующего анализа спектра?

Собсна, мой вопрос в том, на сколько децебел надо давить, и можно ли чтобы частота подавления слегка вылазила за середину спектра (когда частоту среза ставят ровно посередине а не чуть ниже, например в halfband filter).

Мне надо искать пиковую частоту в широком диапазоне с точностью 1%. Подобное делает Constant-Q transform. Хочу сколхозить более простой вариант:

  • гоним FFT по небольшому количеству точек, находим диапазон с максимумом.
  • если частоты низкие, включаем ресамплер, что ушли верхи и гоним FFT для прореженных выборок еще раз.

Не то чтобы я был против FIR на 200 тапов, просто интересно что еще юзают для децимации когда выхлоп потом надо мерить с хорошей точностью.

Vit ★★★★★
() автор топика
Ответ на: комментарий от nioelumiijke

чтобы повысить разрешение FFT в нижних частотах.

вроде как нормальный ответ. самый простой вариант.

Мне нужен не простой, а качественный. Чтобы спектр не исказился.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

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

Да он невменяемый.

anonymous
()
Ответ на: комментарий от Vit

Я cic предложил, потому что ты упомянул чахлый МК. Конечно cic хуже, чем fir, но зато проще с вычислительной точки зрения.

ox55ff ★★★★★
()
Ответ на: комментарий от anonymous

Я тебя не понял. Ты децимацией урезаешь полосу. Что будет с частотами, которые после децимации не влезут в полосу? Думаешь они скажут «ок, ок, мы идём нахер»? Неееет. Они наложатся на другие частоты и засрут тебе там всё.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Они наложатся на другие частоты и засрут тебе там всё.

А mean-фильтр их типа не отфильтровывает? Ну-ну.

anonymous
()
Ответ на: комментарий от anonymous

Никаким фильтром ты из отсутствующего сигнала не вытянешь результат. Или я не прав?

Нейронками можно.

Legioner ★★★★★
()
Ответ на: комментарий от ox55ff

Ну там кортекс M0+. Умножение 32*32 есть.

Можешь помочь сначала с качеством сориентироваться? Хочется понимать, какие параметры должны быть у фильтра, а потом уже подбирать тип.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Ну это от твоей задачи зависит. Концептуально от фильтра что надо? Чтобы поменьше ослаблял сигнал в полосе пропускания, да посильнее ослаблял в полосе подавления. Ну и чтобы переход был как можно круче.

Чем сильнее требования, тем больше коэффициентов потребуется. И тут уже ты сам решаешь на чём сэкономить: параметрах фильтра или вычислительной сложности.

Бери утилиту, которая рассчитывает коэффициенты FIR и играйся с ней пока результаты не удовлетворят. Этих программ полно, есть онлайн. Я в своё время кучу перепробовал. Некоторые оказались говном полным и показывали погоду на Марсе. Названия не помню.

Я на ПЛИС делал. Слал данные на комп и загонял в gnu octave. Там делал fft и смотрел по факту что получилось.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

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

Мне надо детектить фундаментальную частоту 600-6000 герц с точностью до процента в любой точке. Это БПФ на 4096 точек, если не ресемплить.

Данные - 12 разрядов с АЦП. БПФ видимо из CMSIS DSP для q15.

Ну и конечно есть файлы с дампами по 10 секунд, на 250 килогерц.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

надо искать пиковую частоту

надо детектить фундаментальную частоту

Чёткий пацанчик опять обкакался.

anonymous
()
Ответ на: Минутка оффтопа! от Korchevatel

У меня от анонимуса галка в профиле поставлена. Забавно у дурачка пригорает. Может какой-то фанат поехавший. Это ж надо быть таким ущербным и вторичным, чтобы фантазии хватало только тужиться гадости сочинять :)

Vit ★★★★★
() автор топика
Ответ на: Минутка оффтопа! от Korchevatel

По поводу пациента. Ты видел его новую тему, в которую он не пустил анона? Прикол в том, что в вопросе, который он задаёт, на этом форуме гораздо лучше разбирается аноним, чем регистрант. Да хоть у Эдика спроси. Да и любой камент, в том числе про его мамку, поднимает тему в трекере и привлекает новые души. Раз он сделал той блокировкой, по твоему совету, хуже только себе, то за такой дельный совет вам объявляется благодарность!

А можно ли заморозить анонимуса?

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

anonymous
()
Ответ на: комментарий от anonymous

Да хоть у Эдика спроси.

Я бы просто сказал: калокуб используют только идиоты!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.