я должен реализовать фильтр Баттерворта в C. Это легче, получают библиотеку с этой функциональностью или пишут код? [закрытый]

Если вы добавляете функции к классу в расширении (то есть их нет в определении класса), то эти методы статически отправляются в swift, потому что компилятор не может добавить методы в vtable класса (т. Е. Нужно сделать vtable во время компиляции, но вы можете добавить расширение позже, например, в другом модуле). Вот почему компилятор жалуется, что вы не можете override методы (т.е. они не виртуальные).

Диспетчер Objective C работает по-другому, через таблицу выбора, и его можно изменить даже во время выполнения. Вот почему компилятор говорит использовать @objc и, конечно, если вы сделаете это, он будет работать.

ПРИМЕР:

Это не компилируется, потому что мы пытаемся переопределить и динамически отправить статически отправляемую не виртуальную функцию в swift

extension UITableViewCell {
    func a() {
        print("UITableViewCell")
    }
}

class B: UITableViewCell {
    override func a() {
        print("B")
    }
}

let b = B()
print(b.a())

Это работает и печатает «B», потому что с использованием селектора objc

import UIKit
import PlaygroundSupport

extension UITableViewCell {
    @objc func a() {
        print("UITableViewCell")
    }
}

class B: UITableViewCell {
    override func a() {
        print("B")
    }
}

let b = B()
print(b.a())
7
задан 20 March 2009 в 03:30
поделиться

4 ответа

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

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


Я ничего не знаю о том, как Ваш IDE (CodeBlocks) работы, но импорт обычных взятий одна из трех форм в зависимости от того, как библиотека сделана доступной для Вас (детали для следования):

  1. Вы получаете исходный код для одной или нескольких функций (надо надеяться, с хорошей документацией): Прочитайте документы, скопируйте код в соответствующий каталог, добавьте файлы к проекту, попытайтесь скомпилировать, зафиксировать недостающие символы препроцессора, и т.д...
  2. Вы получаете простую двоичную библиотеку и заголовки для Вас платформа (возможно от Вас система управления пакета ОС): Прочитайте документы, скажите IDE, где найти заголовки и библиотеку, попытаться связаться, решите проблемы...
  3. Вы получаете платформу, которая обеспечивает функциональность: Это - немного больше проблемы, но она также запускает с чтения документы, затем вероятно, доходы много как случай библиотеки, но с большим количеством кода, который будет записан...

В любом случае Вы будете в какой-то момент делать

#include "library.h"

в некоторых Ваших исходных файлах для создания внешней функциональности видимой к коду.

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


Другой ТАК подвергает сомнению, который мог бы относиться к Вашим потребностям: библиотека моделирования Аналоговой схемы?.


Это было долгое время, так как я использовал matlab, но если это - Ваш опыт программирования основы, необходимо знать, что существует много услуги, которую matlab предоставил Вам, которые не находятся в простой ванили c. Вы почти наверняка хотите использовать некоторую платформу или другого, чтобы оказать Вам часть той поддержки назад.

5
ответ дан 6 December 2019 в 05:06
поделиться

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

Это - сайт, что мы раньше генерировали наш фильтр:

http://www-users.cs.york.ac.uk/~fisher/mkfilter/

При определении параметров это генерирует функцию для Вас. Вот пример функции, которую мы использовали в нашем приложении, на основе кода, сгенерированного вышеупомянутым веб-сайтом. (Мы, которых УДВАИВАЕТ определение типа, потому что оно разрабатывается на ПК, но предназначается для встроенной платформы - мы должны удостовериться, что размер не изменяется.)

Я люблю читать этот сайт, довольный наконец иметь что-то для содействия!

/* Butterworth filter constants */

#define NZEROS 4
#define NPOLES 4
static DOUBLE xv[NZEROS+1], yv[NPOLES+1];

/* Sampling rate 3000 for testing existing */
/* raw data.  Change to 300 for final product */
#define SAMPLING_RATE 3000

/*******************************************************************************
 * Function:      ButterworthFilter
 *
 * Description:   This function uses the Butterworth filter and returns a new
 *                value for an individual floating point value.
 *
 * Access:        PRIVATE
 *
 * Parameters:    DOUBLE input - value to be converted
 *
 * Globals:       None
 *
 * Returns:       DOUBLE - new value that has been converted
 ******************************************************************************/
static DOUBLE ButterworthFilter (DOUBLE input)
{ 
    /* http://www-users.cs.york.ac.uk/~fisher/cgi-bin/mkfscript */
    /* Butterworth Bandpass filter */
    /* 2nd order */
    /* sample rate - choice of 300 or 3000 Hz */
    /* corner1 freq. = 0.5 or 1 Hz */
    /* corner2 freq. = 20 Hz */
    /* removes high and low frequency noise */

    DOUBLE dCoefficient1 = 0.0;
    DOUBLE dCoefficient2 = 0.0;
    DOUBLE dCoefficient3 = 0.0;
    DOUBLE dCoefficient4 = 0.0;
    DOUBLE dCoefficient5 = 0.0;
    DOUBLE dGain = 0.0;

    /* coefficients will vary depending on sampling rate */
    /* and cornering frequencies                         */
    switch(SAMPLING_RATE)
    {
        case 300:
            /* 1 to 20 Hz */
            dCoefficient1 = 2.0;
            dCoefficient2 = -0.5698403540;
            dCoefficient3 = 2.5753677309;
            dCoefficient4 = -4.4374523505;
            dCoefficient5 = 3.4318654424;
            dGain = 3.198027802e+01;
            break; 

        case 3000:
        default:
            /* 0.5 to 20 Hz */ 
            dCoefficient1 = 2.0;
            dCoefficient2 = -0.9438788347;
            dCoefficient3 = 3.8299315572;
            dCoefficient4 = -5.8282241502;
            dCoefficient5 = 3.9421714258;
            dGain = 2.406930558e+03;
            break;  
    } 

    xv[0] = xv[1]; 
    xv[1] = xv[2]; 
    xv[2] = xv[3]; 
    xv[3] = xv[4]; 
    xv[4] = (DOUBLE)(input / dGain);
    yv[0] = yv[1]; 
    yv[1] = yv[2]; 
    yv[2] = yv[3]; 
    yv[3] = yv[4]; 
    yv[4] = (DOUBLE)((xv[0] + xv[4]) - (dCoefficient1 * xv[2]) + (dCoefficient2 * yv[0]) +
                    (dCoefficient3 * yv[1]) + (dCoefficient4 * yv[2]) +
                    (dCoefficient5 * yv[3]));

    return (yv[4]);
}
30
ответ дан 6 December 2019 в 05:06
поделиться

При использовании Matlab действительно ли это является запретным для соединения с Matlab из кода C? Это - начальная точка. Можно на самом деле попросить, чтобы механизм Matlab сделал что-либо, что можно сделать из интерфейса Matlab путем вызова его от C.

Фильтр Баттерворта является рекурсивным, таким образом, он должен быть реализован как БИХ-фильтр. После того как у Вас есть стабильные коэффициенты фильтра от Вашего Matlab, тестирующего Вас, может просто подать их к универсальному БИХ-(довольно простому) алгоритму. Можно приблизить ответ фильтра с большим фильтром FIR и сверткой, которая может быть перемещена в частотную область для решения проблем фазы, но это не действительно Butterworth, если Вы делаете это.

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

3
ответ дан 6 December 2019 в 05:06
поделиться

В пакете плагинов SWH LADSPA Стива Харриса есть фильтры Баттерворта по адресу

http://plugin.org.uk

Редактировать: За исключением того, что я помню, что код C встроен в RDF для различные причины и генерируются автоматически.

1
ответ дан 6 December 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: