Если вы добавляете функции к классу в расширении (то есть их нет в определении класса), то эти методы статически отправляются в 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())
Это почти наверняка более просто и более безопасно пользоваться хорошо протестированной внешней библиотекой (предполагающий, что можно найти, что тот.... попробовал Google уже?), чем кодировать нетривиальный фильтр самостоятельно.
Но, так как Вы ничего не сказали о Вас приложение, формат Вас данные, и т.д., существует немного больше, что мы можем сказать Вам.
Я ничего не знаю о том, как Ваш IDE (CodeBlocks) работы, но импорт обычных взятий одна из трех форм в зависимости от того, как библиотека сделана доступной для Вас (детали для следования):
В любом случае Вы будете в какой-то момент делать
#include "library.h"
в некоторых Ваших исходных файлах для создания внешней функциональности видимой к коду.
Вероятно, Вы хотите найти библиотеку кандидата сначала, видеть то, что формируется, в ней обеспечивают, затем читайте больше о Вашем IDE для наблюдения, куда Вы идете оттуда.
Другой ТАК подвергает сомнению, который мог бы относиться к Вашим потребностям: библиотека моделирования Аналоговой схемы?.
Это было долгое время, так как я использовал matlab, но если это - Ваш опыт программирования основы, необходимо знать, что существует много услуги, которую matlab предоставил Вам, которые не находятся в простой ванили c. Вы почти наверняка хотите использовать некоторую платформу или другого, чтобы оказать Вам часть той поддержки назад.
Мы должны были применить фильтр Баттерворта к некоторым данным по проекту, что я недавно продолжил работать. (Измерения давления, которые дрейфуют со временем, потому что измерительный прибор нагревается.) Это на самом деле еще более просто, чем включение библиотеки. Действительно просто необходимо включать единственную функцию и добавить его к любому файлу 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]);
}
При использовании Matlab действительно ли это является запретным для соединения с Matlab из кода C? Это - начальная точка. Можно на самом деле попросить, чтобы механизм Matlab сделал что-либо, что можно сделать из интерфейса Matlab путем вызова его от C.
Фильтр Баттерворта является рекурсивным, таким образом, он должен быть реализован как БИХ-фильтр. После того как у Вас есть стабильные коэффициенты фильтра от Вашего Matlab, тестирующего Вас, может просто подать их к универсальному БИХ-(довольно простому) алгоритму. Можно приблизить ответ фильтра с большим фильтром FIR и сверткой, которая может быть перемещена в частотную область для решения проблем фазы, но это не действительно Butterworth, если Вы делаете это.
Я рекомендовал бы создать алгоритм с нуля как осуществление изучения, но если Вам нужен он как можно скорее существует, вероятно, любое число библиотек там для помощи Вам. Это подошло в поиске.
В пакете плагинов SWH LADSPA Стива Харриса есть фильтры Баттерворта по адресу
Редактировать: За исключением того, что я помню, что код C встроен в RDF для различные причины и генерируются автоматически.