LINUX.ORG.RU

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

 , ,


0

1

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

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

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

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

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

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

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

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

anonymous ()
Ответ на: комментарий от 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 ★★★★★ ()

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

Про выбор частоты среза здесь есть. Раздел «Использование 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Re: Минутка оффтопа!

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

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

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

anonymous ()