Автор |
Сообщение |
|
Дата: 29 Окт 2011 12:03:06
#
Programmist
после фильтрации уровень сигнала значительно снижается, так что эта функция ни на что не влияет (я проверял)
ввёл её так на всякий случай
|
|
Дата: 29 Окт 2011 12:04:45 · Поправил: rst59 (29 Окт 2011 12:06:17)
#
Mesh
вот ето я тупанул :) ну да, конечно -32768...32767
но вункция всё ж роли не играет, дело не в ней
массивы такие
type
TSmallIntArr = array of SmallInt;
wavein, waveout: TSmallIntArr;
|
Реклама Google
|
|
|
Дата: 29 Окт 2011 12:11:38
#
rst59
после фильтрации уровень сигнала значительно снижается, так что эта функция ни на что не влияет (я проверял)
Это далеко не факт, а частный случай, контроль амплитуды на выходе всегда необходим.
|
|
Дата: 29 Окт 2011 12:13:56
#
Programmist
да контролировал я, не было превышения
|
|
Дата: 29 Окт 2011 12:14:03 · Поправил: Mesh (29 Окт 2011 12:14:59)
#
rst59 Тода значти косяк в прямом чтении из массива smallint даты как real. Если правильно помню в фильтре входная дата в этом типе. Добавте просто явное приведение типо так что ли:
var
....
a:real;
begin
LPF1 := TIirLPF.Create(12000, 48000, 0.8, 12, 0.9);
SetLength(waveout, Length(wavein));
for i := Low(wavein) to High(wavein) do
begin
a:=wavein[i];
waveout[i] := Norm(LPF1.Exec(a));
end;
Уж по крайней мере тут вроде всё чики пуки, если не будет работать тогда где-то ещё какие-то колёса, ну не может это не работать. Имхо ессно.
|
|
Дата: 29 Окт 2011 12:17:32
#
Добавте просто явное приведение
сделал, всё то же...
|
|
Дата: 29 Окт 2011 12:19:21 · Поправил: Programmist (29 Окт 2011 12:23:43)
#
Не будет работать, функцию Norm надо выбросить, и следить за амплитудой.
Вот так можно проверить, для начала (число 100 подобрать экспериментально)
for i := 0 to High(wavein) do
begin
a:=wavein[i];
waveout[i] := Round( LPF1.Exec(a / 100) );
end;
|
|
Дата: 29 Окт 2011 12:20:26 · Поправил: rst59 (29 Окт 2011 12:25:04)
#
Programmist
будь по вашему
max := 0;
...
a := LPF1.Exec(wavein[i]);
if Abs(a) > max then max := Abs(a);
waveout[i] := Round(a);
выдало max = 11417,5950677173
всё в пределах нормы, но спектр всё тот же
|
|
Дата: 29 Окт 2011 12:22:58
#
rst59 Я файлик с шумом не смотрел, пока так превинтивно чирикаю, может там и в норме всё. Чуть попозжее гляну.
|
|
Дата: 29 Окт 2011 12:43:57 · Поправил: Programmist (29 Окт 2011 12:45:20)
#
|
|
Дата: 29 Окт 2011 13:06:17
#
Programmist
оооо!!! спасибо! с вашим TLPF всё чётко фильтруется
|
|
Дата: 29 Окт 2011 13:19:15
#
rst59
спасибо! с вашим TLPF всё чётко фильтруется
Не за что, он похож на тот LPF, что Eralgen выкладывал, просто я там правил чего-то, уже не помню. ФВЧ тоже из него сделан, не факт, что правильно, но работает.
IQ конвертер мне тоже нужен будет, сразу понять, как Mesh сделал, не смог, придется вникать в детали, это потом, пока оболочки для проги нет и не хватает дециматора.
|
|
Дата: 29 Окт 2011 18:51:45
#
rst59 Да, чёт не то в ваших примерах с шумом. Срез на уровне 15-16 килогерц, но ежели всё уже устаканилось то и ладно.
|
|
Дата: 29 Окт 2011 20:14:21
#
Mesh
хотелось бы реализовать такой фильтр, ну вот как в SA например, чтоб чётко отсекал ненужный участок спектра
|
|
Дата: 29 Окт 2011 20:37:58
#
|
|
Дата: 29 Окт 2011 20:46:51
#
rst59 А там сокрее всего не БИХ, потому что фаза после фильтеринга не рушится. Оно-то и на БИХ можно это сварганить, но ихмо гемороя больше будет, чем на КИХ.
|
|
Дата: 29 Окт 2011 20:57:34
#
FFT никогда не рушит фазу, но там другие проблемы, имхо самый надежный способ, свалить АЧХ 2-ым - 3-им порядком ФНЧ, а остальное дорезать FFT, иначе все равно что-то останется, или фильтровать будет вечно.
|
|
Дата: 29 Окт 2011 21:07:12
#
Programmist Удаление бинов после FFT эт любимая забава пионеров. Посмторите любой документ по ЦОС, чёто отцы и забугорные в том числе, ингорят тупо и упорно, это "гениальнейшее решение", всё норовят честному люду мозг вывернуть. :-) Хотя там выворачивать-то особо и нечему, но вот народ любит "открытия совершать" раз за разом.
|
|
Дата: 30 Окт 2011 19:06:04
#
Programmist, Mesh
а как избежать щелчков при склейке блоков обратно после БПФ?
|
|
Дата: 30 Окт 2011 19:27:16
#
rst59 Дык как бы посмотреть в доках по ЦОС, методы с перекрытием или накоплением. Эт в доках пишут, как и про проблемы обнулений бинов. Читать тока никто не любит. :-)
|
|
Дата: 30 Окт 2011 19:47:54
#
а как избежать щелчков при склейке блоков обратно после БПФ?
Это самое неприятное явление, если в реальном времени работать, минимум двойная буферизация нужна, я всегда четыре буфера ставлю. В статике все должно нормально склеиваться, но от задачи много зависит, как правило, без окон обойтись сложно.
|
|
Дата: 30 Окт 2011 21:54:21
#
Mesh, Programmist
спасибо, буд экспериментировать
|
|
Дата: 30 Окт 2011 22:12:45
#
Programmist
Это самое неприятное явление, если в реальном времени работать, минимум двойная буферизация нужна, я всегда четыре буфера ставлю. В статике все должно нормально склеиваться, но от задачи много зависит, как правило, без окон обойтись сложно.
Плохой совет, от искажений так не избавиться, это вообще даже не фильтрация. Либо быстрая свёртка как Mesh выше указывал, но так частоты не "позануляешь", поскольку сначала во временной области нужно ИХ фильтра нулями дополнять. Либо банки фильтров с передискретизацией, здесь можно "частоты занулять", как вы любите, и без искажений.
|
|
Дата: 30 Окт 2011 22:28:41
#
Здесь поможет только эксперимент, важно найти хороший модуль FFT, в сети их много, все дают разные результаты. Удивительно, но факт. Мне приклеился тот, что на asm-e (есть почти во всех исходниках), но он работает только с Single и точности не всегда хватает, да и приколы в нем есть недобитые. Может, когда и до него руки дойдут.
А от искажений можно избавляться долго, однозначного решения пока нет, имхо сначала надо сделать, чтобы хоть как-то работало. Оно и есть начало пути :)
|
|
Дата: 30 Окт 2011 22:33:08
#
Programmist имхо сначала надо сделать, чтобы хоть как-то работало Я хз конечно, но вот мне дедушки програмеры вдалбливали дргуое. Сначала должно работать как надо! Пускай медленно оченнно медленно но как надо! А вот уж потом отчекивай алглоритмы там, оптимизацию и всё такое. Ну да ту у каждого свои ходы.
|
|
Дата: 30 Окт 2011 22:49:10
#
Mesh
Сначала должно работать как надо!
Ну не знаю, если работать нечему, то, как надо оно работать уж точно никак не сможет, здесь действительно, каждый решает для себя сам, с какой стороны подходить к вопросу.
|
|
Дата: 30 Окт 2011 22:54:24 · Поправил: petr0v (30 Окт 2011 22:55:35)
#
Programmist
Здесь поможет только эксперимент, важно найти хороший модуль FFT, в сети их много, все дают разные результаты. Удивительно, но факт. Мне приклеился тот, что на asm-e (есть почти во всех исходниках), но он работает только с Single и точности не всегда хватает, да и приколы в нем есть недобитые. Может, когда и до него руки дойдут.
А от искажений можно избавляться долго, однозначного решения пока нет, имхо сначала надо сделать, чтобы хоть как-то работало. Оно и есть начало пути :)
Никакой эксперимент не поможет без знания теории, она давно разработана, бери и используй. FFT нужно правильно использовать, а нет так как захотелось. Решения есть, можно получить сколь угодно качественный результат, не нужно изобретать плохой велосипед.
|
|
Дата: 30 Окт 2011 23:08:17
#
petr0v
Читаю кое-что, когда время есть, а как выглядят нормальные и качественные решения, видно из исходных кодов. Это мегабайты текста, которые написаны не от хорошей жизни. Одна беда - слишком много ошибок и недоработок.
|
|
Дата: 31 Окт 2011 12:16:41 · Поправил: sea (31 Окт 2011 12:23:47)
#
rst59
можете выложить выши делфяные исходники?
Мне как-то Programmist присылал свои исходники. Там все так грамотно названо и расписано, что я теперь стесняюсь свои произведения выкладывать )) Но я причешу немного и вышлю. В общем логика такая: запускаю Filter Solutions выбираю какой-то определенный тип фильтра, задаю его параметры, ставлю тип Digital, указываю дискретизацию. Смотрю АЧХ на Frequency Response, может что-то еще меняю, пока не получу интересующие меня параметры. Потом нажимаю на Transfer Function - вижу функцию. Если нажать code - то выдадут текст на с++. Если нажать VEC то выдадутся параметры, нажимаю копировать и получаю что-то типа
NUM = [1.882e-02, -1.872e-02, -1.872e-02, 1.882e-02]
DEN = [1, -2.934, 2.873, -.9387]
Можно варьировать количество знаков после запятой.
Моя программа настроена так, что я ей эти две строки скармливаю, по ним она определяет порядок фильтра и соответственно размер массива задержки. Внутри все считаю пока в дробных числах. В принципе пробовал и в целых, но фиксированным алгоритмом под определенный фильтр.
Сама программа выдаёт что-то типа этого:
double DigFil(invar, initval, setic)
double invar, initval; int setic;
/******************************************************************************/
/* Filter Solutions Version 8.0 Nuhertz Technologies, L.L.C. */
/* http://www.nuhertz.com */
/* +01 602-216-2682 */
/* 3rd Order Low Pass Elliptic */
/* Bilinear Transformation with Prewarping */
/* Sample Frequency = 48.00 KHz */
/* Standard Form */
/* Arithmetic Precision = 10 Digits */
/* */
/* Pass Band Frequency = 3.000 KHz */
/* Pass Band Ripple = 1.000 dB */
/* */
/* Stop Band Ratio = 1.1 */
/* Stop Band Frequency = 3.300 KHz */
/* Stop Band Attenuation = 11.48 dB */
/* */
/******************************************************************************/
/* */
/* Input Variable Definitions: */
/* Inputs: */
/* invar double The input to the filter */
/* initvar double The initial value of the filter */
/* setic int 1 to initialize the filter to the value of initvar */
/* */
/* There is no requirement to ever initialize the filter. */
/* The default initialization is zero when the filter is first called */
/* */
/******************************************************************************/
/* */
/* This software is automatically generated by Filter Solutions. There are */
/* no restrictions from Nuhertz Technologies, L.L.C. regarding the use and */
/* distributions of this software. */
/* */
/******************************************************************************/
{
double sumnum, sumden; int i;
static double delay[4] = {0.0,0.0,0.0,0.0};
static double znum[4] = {
.1037026894,
-8.236913957e-02,
-8.236913957e-02,
.1037026894 };
static double zden[3] = {
-.6688198598,
2.207470036,
-2.495983077 };
if (setic==1){
for (i=0;i<=3;i++) delay[i] = 23.43726216*initval;
return initval; }
else{
sumden=0.0;
sumnum=0.0;
for (i=0;i<=2;i++){
delay[i] = delay[i+1];
sumden += delay[i]*zden[i];
sumnum += delay[i]*znum[i];
}
delay[3] = invar-sumden;
sumnum += delay[3]*znum[3];
return sumnum; } } |
|
Дата: 03 Ноя 2011 08:54:47 · Поправил: sea (03 Ноя 2011 08:55:34)
#
Подниму тему.
ProgrammistЗдесь поможет только эксперимент, важно найти хороший модуль FFT
Пробовал я как-то первый попавшийся модуль для FFT в своей программе. Поглядите - это не он?
Выложил тут. Вдруг пригодится.
Delphi FFT
Писалась некоторое время назат небольшая контрольная на дельфи с использованием FFT. Интерфейс может очень напоминать всем известную программу)) Функционал ооооочень ограничен: только просмотр файлов данных и wav файлов одного единственного формата: WAVE, 16-бит, моно любой дискретизации.
Увеличить |
Реклама Google |
|