Перейти к содержанию
    

Создать массив констант по формуле

Допустим, размещаю в ОЗУ массив коэффициентов для БПФ, по формуле:

      for (uint32_t i = 0; i < FFT_N; i++) {
        *pSigRe++ = 0.5 * (1 - cos(2 * PI / (FFT_N - 1) * i));
      }

Можно ли это сделать при компиляции, расположив массив во flash?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Допустим, размещаю в ОЗУ массив коэффициентов для БПФ, по формуле:

      for (uint32_t i = 0; i < FFT_N; i++) {
        *pSigRe++ = 0.5 * (1 - cos(2 * PI / (FFT_N - 1) * i));
      }

Можно ли это сделать при компиляции, расположив массив во flash?

На всякий случай - язык цэ или плюсы? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На всякий случай - язык цэ или плюсы? :)

С

 

можно посчитать отдельно, в Matlab...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Cog

 

/**
*   \brief Таблица данных для синтеза синусоиды ЦАПом
*   Формируется автоматически генератором COG

\brief Скрипт генератора таблицы
\code
*/

/*
[[[cog
import cog
import math

def print_table(name):
NN = col * row
N = NN / periods
Min = -amp
Max = amp
Med = (Min + Max) / 2
cog.out('#define %s		{' %name )

for i in range(NN):
	Phase = i * 2 * math.pi / N 
	if i % col == 0:
		cog.outl('	\\')
		cog.out('	')
	cog.out('	%5d' % math.floor(Med + amp * math.sin(Phase)))
	if i < NN-1:
		cog.out(',	')
cog.outl('}\n')
str = name + '_SIZE'
cog.out('#define %s		' %str)
cog.outl('%d'  %NN)

str = name + '_PERIODS'
cog.out('#define %s		' %str)
cog.outl('%d'  %periods)

periods = 1
col = 8
row = 128
amp = 2000

print_table('SIN_TABLE_1')

cog.outl()

#periods = 6
row = 16
amp = 500

print_table('SIN_TABLE_10')

]]]*/
#define SIN_TABLE_1		{	\
	    0,		   12,		   24,		   36,		   49,		   61,		   73,		   85,		\
	   98,		  110,		  122,		  134,		  147,		  159,		  171,		  183,		\
	  196,		  208,		  220,		  232,		  244,		  256,		  269,		  281,		\
	  293,		  305,		  317,		  329,		  341,		  354,		  366,		  378,		\
	  390,		  402,		  414,		  426,		  438,		  450,		  462,		  474,		\
	  485,		  497,		  509,		  521,		  533,		  545,		  557,		  568,		\
	  580,		  592,		  604,		  615,		  627,		  639,		  650,		  662,		\
	  673,		  685,		  696,		  708,		  719,		  731,		  742,		  754,		\
	  765,		  776,		  787,		  799,		  810,		  821,		  832,		  844,		\
	  855,		  866,		  877,		  888,		  899,		  910,		  921,		  931,		\
	  942,		  953,		  964,		  975,		  985,		  996,		 1007,		 1017,		\
	 1028,		 1038,		 1049,		 1059,		 1069,		 1080,		 1090,		 1100,		\
	 1111,		 1121,		 1131,		 1141,		 1151,		 1161,		 1171,		 1181,		\
	 1191,		 1201,		 1211,		 1220,		 1230,		 1240,		 1249,		 1259,		\
	 1268,		 1278,		 1287,		 1297,		 1306,		 1315,		 1324,		 1333,		\
	 1343,		 1352,		 1361,		 1370,		 1379,		 1387,		 1396,		 1405,		\
	 1414,		 1422,		 1431,		 1440,		 1448,		 1456,		 1465,		 1473,		\
	 1481,		 1490,		 1498,		 1506,		 1514,		 1522,		 1530,		 1538,		\
	 1546,		 1553,		 1561,		 1569,		 1576,		 1584,		 1591,		 1599,		\
	 1606,		 1613,		 1620,		 1628,		 1635,		 1642,		 1649,		 1656,		\
	 1662,		 1669,		 1676,		 1683,		 1689,		 1696,		 1702,		 1709,		\
	 1715,		 1721,		 1727,		 1734,		 1740,		 1746,		 1752,		 1758,		\
	 1763,		 1769,		 1775,		 1780,		 1786,		 1791,		 1797,		 1802,		\
	 1807,		 1813,		 1818,		 1823,		 1828,		 1833,		 1838,		 1843,		\
	 1847,		 1852,		 1857,		 1861,		 1865,		 1870,		 1874,		 1878,		\
	 1883,		 1887,		 1891,		 1895,		 1899,		 1902,		 1906,		 1910,		\
	 1913,		 1917,		 1920,		 1924,		 1927,		 1930,		 1933,		 1937,		\
	 1940,		 1943,		 1945,		 1948,		 1951,		 1954,		 1956,		 1959,		\
	 1961,		 1963,		 1966,		 1968,		 1970,		 1972,		 1974,		 1976,		\
	 1978,		 1980,		 1981,		 1983,		 1984,		 1986,		 1987,		 1989,		\
	 1990,		 1991,		 1992,		 1993,		 1994,		 1995,		 1996,		 1996,		\
	 1997,		 1998,		 1998,		 1999,		 1999,		 1999,		 1999,		 1999,		\
	 2000,		 1999,		 1999,		 1999,		 1999,		 1999,		 1998,		 1998,		\
	 1997,		 1996,		 1996,		 1995,		 1994,		 1993,		 1992,		 1991,		\
	 1990,		 1989,		 1987,		 1986,		 1984,		 1983,		 1981,		 1980,		\
	 1978,		 1976,		 1974,		 1972,		 1970,		 1968,		 1966,		 1963,		\
	 1961,		 1959,		 1956,		 1954,		 1951,		 1948,		 1945,		 1943,		\
	 1940,		 1937,		 1933,		 1930,		 1927,		 1924,		 1920,		 1917,		\
	 1913,		 1910,		 1906,		 1902,		 1899,		 1895,		 1891,		 1887,		\
	 1883,		 1878,		 1874,		 1870,		 1865,		 1861,		 1857,		 1852,		\
	 1847,		 1843,		 1838,		 1833,		 1828,		 1823,		 1818,		 1813,		\
	 1807,		 1802,		 1797,		 1791,		 1786,		 1780,		 1775,		 1769,		\
	 1763,		 1758,		 1752,		 1746,		 1740,		 1734,		 1727,		 1721,		\
	 1715,		 1709,		 1702,		 1696,		 1689,		 1683,		 1676,		 1669,		\
	 1662,		 1656,		 1649,		 1642,		 1635,		 1628,		 1620,		 1613,		\
	 1606,		 1599,		 1591,		 1584,		 1576,		 1569,		 1561,		 1553,		\
	 1546,		 1538,		 1530,		 1522,		 1514,		 1506,		 1498,		 1490,		\
	 1481,		 1473,		 1465,		 1456,		 1448,		 1440,		 1431,		 1422,		\
	 1414,		 1405,		 1396,		 1387,		 1379,		 1370,		 1361,		 1352,		\
	 1343,		 1333,		 1324,		 1315,		 1306,		 1297,		 1287,		 1278,		\
	 1268,		 1259,		 1249,		 1240,		 1230,		 1220,		 1211,		 1201,		\
	 1191,		 1181,		 1171,		 1161,		 1151,		 1141,		 1131,		 1121,		\
	 1111,		 1100,		 1090,		 1080,		 1069,		 1059,		 1049,		 1038,		\
	 1028,		 1017,		 1007,		  996,		  985,		  975,		  964,		  953,		\
	  942,		  931,		  921,		  910,		  899,		  888,		  877,		  866,		\
	  855,		  844,		  832,		  821,		  810,		  799,		  787,		  776,		\
	  765,		  754,		  742,		  731,		  719,		  708,		  696,		  685,		\
	  673,		  662,		  650,		  639,		  627,		  615,		  604,		  592,		\
	  580,		  568,		  557,		  545,		  533,		  521,		  509,		  497,		\
	  485,		  474,		  462,		  450,		  438,		  426,		  414,		  402,		\
	  390,		  378,		  366,		  354,		  341,		  329,		  317,		  305,		\
	  293,		  281,		  269,		  256,		  244,		  232,		  220,		  208,		\
	  196,		  183,		  171,		  159,		  147,		  134,		  122,		  110,		\
	   98,		   85,		   73,		   61,		   49,		   36,		   24,		   12,		\
	    0,		  -13,		  -25,		  -37,		  -50,		  -62,		  -74,		  -86,		\
	  -99,		 -111,		 -123,		 -135,		 -148,		 -160,		 -172,		 -184,		\
	 -197,		 -209,		 -221,		 -233,		 -245,		 -257,		 -270,		 -282,		\
	 -294,		 -306,		 -318,		 -330,		 -342,		 -355,		 -367,		 -379,		\
	 -391,		 -403,		 -415,		 -427,		 -439,		 -451,		 -463,		 -475,		\
	 -486,		 -498,		 -510,		 -522,		 -534,		 -546,		 -558,		 -569,		\
	 -581,		 -593,		 -605,		 -616,		 -628,		 -640,		 -651,		 -663,		\
	 -674,		 -686,		 -697,		 -709,		 -720,		 -732,		 -743,		 -755,		\
	 -766,		 -777,		 -788,		 -800,		 -811,		 -822,		 -833,		 -845,		\
	 -856,		 -867,		 -878,		 -889,		 -900,		 -911,		 -922,		 -932,		\
	 -943,		 -954,		 -965,		 -976,		 -986,		 -997,		-1008,		-1018,		\
	-1029,		-1039,		-1050,		-1060,		-1070,		-1081,		-1091,		-1101,		\
	-1112,		-1122,		-1132,		-1142,		-1152,		-1162,		-1172,		-1182,		\
	-1192,		-1202,		-1212,		-1221,		-1231,		-1241,		-1250,		-1260,		\
	-1269,		-1279,		-1288,		-1298,		-1307,		-1316,		-1325,		-1334,		\
	-1344,		-1353,		-1362,		-1371,		-1380,		-1388,		-1397,		-1406,		\
	-1415,		-1423,		-1432,		-1441,		-1449,		-1457,		-1466,		-1474,		\
	-1482,		-1491,		-1499,		-1507,		-1515,		-1523,		-1531,		-1539,		\
	-1547,		-1554,		-1562,		-1570,		-1577,		-1585,		-1592,		-1600,		\
	-1607,		-1614,		-1621,		-1629,		-1636,		-1643,		-1650,		-1657,		\
	-1663,		-1670,		-1677,		-1684,		-1690,		-1697,		-1703,		-1710,		\
	-1716,		-1722,		-1728,		-1735,		-1741,		-1747,		-1753,		-1759,		\
	-1764,		-1770,		-1776,		-1781,		-1787,		-1792,		-1798,		-1803,		\
	-1808,		-1814,		-1819,		-1824,		-1829,		-1834,		-1839,		-1844,		\
	-1848,		-1853,		-1858,		-1862,		-1866,		-1871,		-1875,		-1879,		\
	-1884,		-1888,		-1892,		-1896,		-1900,		-1903,		-1907,		-1911,		\
	-1914,		-1918,		-1921,		-1925,		-1928,		-1931,		-1934,		-1938,		\
	-1941,		-1944,		-1946,		-1949,		-1952,		-1955,		-1957,		-1960,		\
	-1962,		-1964,		-1967,		-1969,		-1971,		-1973,		-1975,		-1977,		\
	-1979,		-1981,		-1982,		-1984,		-1985,		-1987,		-1988,		-1990,		\
	-1991,		-1992,		-1993,		-1994,		-1995,		-1996,		-1997,		-1997,		\
	-1998,		-1999,		-1999,		-2000,		-2000,		-2000,		-2000,		-2000,		\
	-2000,		-2000,		-2000,		-2000,		-2000,		-2000,		-1999,		-1999,		\
	-1998,		-1997,		-1997,		-1996,		-1995,		-1994,		-1993,		-1992,		\
	-1991,		-1990,		-1988,		-1987,		-1985,		-1984,		-1982,		-1981,		\
	-1979,		-1977,		-1975,		-1973,		-1971,		-1969,		-1967,		-1964,		\
	-1962,		-1960,		-1957,		-1955,		-1952,		-1949,		-1946,		-1944,		\
	-1941,		-1938,		-1934,		-1931,		-1928,		-1925,		-1921,		-1918,		\
	-1914,		-1911,		-1907,		-1903,		-1900,		-1896,		-1892,		-1888,		\
	-1884,		-1879,		-1875,		-1871,		-1866,		-1862,		-1858,		-1853,		\
	-1848,		-1844,		-1839,		-1834,		-1829,		-1824,		-1819,		-1814,		\
	-1808,		-1803,		-1798,		-1792,		-1787,		-1781,		-1776,		-1770,		\
	-1764,		-1759,		-1753,		-1747,		-1741,		-1735,		-1728,		-1722,		\
	-1716,		-1710,		-1703,		-1697,		-1690,		-1684,		-1677,		-1670,		\
	-1663,		-1657,		-1650,		-1643,		-1636,		-1629,		-1621,		-1614,		\
	-1607,		-1600,		-1592,		-1585,		-1577,		-1570,		-1562,		-1554,		\
	-1547,		-1539,		-1531,		-1523,		-1515,		-1507,		-1499,		-1491,		\
	-1482,		-1474,		-1466,		-1457,		-1449,		-1441,		-1432,		-1423,		\
	-1415,		-1406,		-1397,		-1388,		-1380,		-1371,		-1362,		-1353,		\
	-1344,		-1334,		-1325,		-1316,		-1307,		-1298,		-1288,		-1279,		\
	-1269,		-1260,		-1250,		-1241,		-1231,		-1221,		-1212,		-1202,		\
	-1192,		-1182,		-1172,		-1162,		-1152,		-1142,		-1132,		-1122,		\
	-1112,		-1101,		-1091,		-1081,		-1070,		-1060,		-1050,		-1039,		\
	-1029,		-1018,		-1008,		 -997,		 -986,		 -976,		 -965,		 -954,		\
	 -943,		 -932,		 -922,		 -911,		 -900,		 -889,		 -878,		 -867,		\
	 -856,		 -845,		 -833,		 -822,		 -811,		 -800,		 -788,		 -777,		\
	 -766,		 -755,		 -743,		 -732,		 -720,		 -709,		 -697,		 -686,		\
	 -674,		 -663,		 -651,		 -640,		 -628,		 -616,		 -605,		 -593,		\
	 -581,		 -569,		 -558,		 -546,		 -534,		 -522,		 -510,		 -498,		\
	 -486,		 -475,		 -463,		 -451,		 -439,		 -427,		 -415,		 -403,		\
	 -391,		 -379,		 -367,		 -355,		 -342,		 -330,		 -318,		 -306,		\
	 -294,		 -282,		 -270,		 -257,		 -245,		 -233,		 -221,		 -209,		\
	 -197,		 -184,		 -172,		 -160,		 -148,		 -135,		 -123,		 -111,		\
	  -99,		  -86,		  -74,		  -62,		  -50,		  -37,		  -25,		  -13}

#define SIN_TABLE_1_SIZE		1024
#define SIN_TABLE_1_PERIODS		1

#define SIN_TABLE_10		{	\
	    0,		   24,		   49,		   73,		   97,		  121,		  145,		  168,		\
	  191,		  213,		  235,		  257,		  277,		  297,		  317,		  335,		\
	  353,		  370,		  386,		  401,		  415,		  428,		  440,		  451,		\
	  461,		  470,		  478,		  485,		  490,		  494,		  497,		  499,		\
	  500,		  499,		  497,		  494,		  490,		  485,		  478,		  470,		\
	  461,		  451,		  440,		  428,		  415,		  401,		  386,		  370,		\
	  353,		  335,		  317,		  297,		  277,		  257,		  235,		  213,		\
	  191,		  168,		  145,		  121,		   97,		   73,		   49,		   24,		\
	    0,		  -25,		  -50,		  -74,		  -98,		 -122,		 -146,		 -169,		\
	 -192,		 -214,		 -236,		 -258,		 -278,		 -298,		 -318,		 -336,		\
	 -354,		 -371,		 -387,		 -402,		 -416,		 -429,		 -441,		 -452,		\
	 -462,		 -471,		 -479,		 -486,		 -491,		 -495,		 -498,		 -500,		\
	 -500,		 -500,		 -498,		 -495,		 -491,		 -486,		 -479,		 -471,		\
	 -462,		 -452,		 -441,		 -429,		 -416,		 -402,		 -387,		 -371,		\
	 -354,		 -336,		 -318,		 -298,		 -278,		 -258,		 -236,		 -214,		\
	 -192,		 -169,		 -146,		 -122,		  -98,		  -74,		  -50,		  -25}

#define SIN_TABLE_10_SIZE		128
#define SIN_TABLE_10_PERIODS		1
//[[[end]]]

 

Остается добавить

static const int SinTable1Data[SIN_TABLE_1_SIZE] = SIN_TABLE_1;
static const int SinTable10Data[SIN_TABLE_10_SIZE] = SIN_TABLE_10;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С

можно посчитать отдельно, в Matlab...

Хотел было на constexpr (C++11) наживку закинуть :)

Но видимо не понял вопроса...

 

Написать на С программку, которая сгенерирует си-файл с инициализированным const массивом - дело 5 минут (stdio.h + math.h).

В чем вопрос то? :)

Боитесь, что инициализированный const массив все равно будет размещен в ОЗУ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написать на С программку, которая сгенерирует си-файл с инициализированным const массивом - дело 5 минут (stdio.h + math.h).

В чем вопрос то? :)

Боитесь, что инициализированный const массив все равно будет размещен в ОЗУ?

Вы, видимо, имеете в виду Visual Studio или нечто подобное? Такого не имею. Keil uVision4 - на нем можно? :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы, видимо, имеете в виду Visual Studio или нечто подобное? Такого не имею. Keil uVision4 - на нем можно? :rolleyes:

:) Еще и как! Поднять консоль с stdio на stm32f103 и запустить в симуляторе, результат вывода в консоль скопипастить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я попробовал в Matlab. Не знаю, как в одной строке несколько чисел написать, и после последнего числа запятая - лишняя.

FFT_N = 64;
fid = fopen('FFT_Coef.c', 'w');
for i = 1 : FFT_N
C(i) = 0.5 - 0.5 * cos(2 * pi * i / FFT_N);
end
fprintf(fid, 'static const float Coef[] = {\n' );
% fprintf(fid, '%10.10f\n', C);
fprintf(fid, '%f,\n ', C);
fprintf(fid, '};');
fclose(fid);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно ли это сделать при компиляции, расположив массив во flash?

Меня вот это при компиляции смущает. Означает ли это, что размер массива заранее неизвестен, и только в момент компиляции вы хотите задавать? Если да, то это одна задача.

 

Но поскольку звучит МатЛаб, то трудно поверить, что вы хотите вызывать его из Кейла. Значит считаете заранее, и используете в своем коде, как было предложено выше. Можно и руками убрать лишнюю точку с запятой.

 

У меня была аналогичная задача с пересчетом температуры. Я расчитал таблицу на питоне, засунул в файл и использую. Так как в разных проектах диапазон температуры различен - часть массива ограничена ifdefом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Любой вариант годится, а размер массива просто задается макроопределением, для универсальности. Создать файл матлабом, или питоном, или экселом, или еще как-то - этот способ понятен. Так и сделаю.

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

 

Научился записывать в одной строке несколько чисел.

fprintf(fid, '%f, %f, %f, %f, \n ', C);

Жаль, '\b' что-то не стирает последний символ (запятую).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы, видимо, имеете в виду Visual Studio или нечто подобное? Такого не имею. Keil uVision4 - на нем можно? :rolleyes:

Шутите? :)

Мне казалось, что у каждго эмбеддера должен быть и "десктопный" тулчейн.

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

 

Есессно имею ввиду что-то из Visual Studio Express, CodeBlocks + MinGW или MinGW + плюс "ВашЛюбимыйРедактор"...

Все это абсолютно бесплатно, в использовании интуитивно просто и понятно.

Трабл то в чем? Не знаете где взять/как установить? Или места на HDD совсем нет? :)

 

Всего навсего нужно написать маленькую консольную прогу, которая сгенерит файл (напр. "fft_table.c") например такого содержания:

const int fft_table[] = {
    1,
    2, 
    3,
    4
};

Ну или static const... Это как удобнее. Файл просто инклюдите у себя в исходниках (#include "fft_table.c").

Компилятор этот const массив поместит в секцию .rodata, которая должна быть в ROM-памяти (во флеше).

 

Требуется только знание Си (который Вы и так уже знаете), плюс немного из стандартной библиотеки - stdio.h (fopen, fclose, fprintf) + math.h (cos, sin).

Работы на 5 минут... :)

Если что-то подзабыли - откройте справочник по Си Г. Шилдта. Потратите еще 5-10 минут, не более...

 

Финальная стадия - консольную прогу сохраняете в каталоге проекта, в make-файле добавляете fft_table.c в список файлов и добавляете новую цель fft_table.c (зависимостей нет, команда для запуска - запуск этой самой консольной проги, с параметрами или без - это как прогу напишите)...

fft_table.c:
    @fft_generator.exe

Вот как-то так...

Изменено пользователем winipuh

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Шутите? :)

Мне казалось, что у каждго эмбеддера должен быть и "десктопный" тулчейн.

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

Убедили. :) Установлю VisualStudio Express. Потом... завтра, послезавтра... :rolleyes:

Пока же обошелся Matlab-ом.

http://electronix.ru/forum/index.php?showt...t&p=1198430

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Убедили. :) Установлю VisualStudio Express. Потом... завтра, послезавтра... :rolleyes:

ИМХО, для консольных мелочей лучше уж Watcom. Но компилятор для хоста вещь совершенно необходимая, Matlab его не заменит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ИМХО, для консольных мелочей лучше уж Watcom.

А по мне, C::B ещё лучше. Искаропки умеет компилить как консольные, так и win32 GUI, Qt, GTK, wxWidgets и многое другое.

CygWin в комплекте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...