ViKo 1 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба Допустим, размещаю в ОЗУ массив коэффициентов для БПФ, по формуле: for (uint32_t i = 0; i < FFT_N; i++) { *pSigRe++ = 0.5 * (1 - cos(2 * PI / (FFT_N - 1) * i)); } Можно ли это сделать при компиляции, расположив массив во flash? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
winipuh 0 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба Допустим, размещаю в ОЗУ массив коэффициентов для БПФ, по формуле: for (uint32_t i = 0; i < FFT_N; i++) { *pSigRe++ = 0.5 * (1 - cos(2 * PI / (FFT_N - 1) * i)); } Можно ли это сделать при компиляции, расположив массив во flash? На всякий случай - язык цэ или плюсы? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба На всякий случай - язык цэ или плюсы? :) С можно посчитать отдельно, в Matlab... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 1 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба всегда использовал для этой цели Excel, минус только один - табличка получается в столбик, т.е. слишком длинная... но если вынести в отдельный хидер - жить можно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
winipuh 0 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба С можно посчитать отдельно, в Matlab... Хотел было на constexpr (C++11) наживку закинуть :) Но видимо не понял вопроса... Написать на С программку, которая сгенерирует си-файл с инициализированным const массивом - дело 5 минут (stdio.h + math.h). В чем вопрос то? :) Боитесь, что инициализированный const массив все равно будет размещен в ОЗУ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Написать на С программку, которая сгенерирует си-файл с инициализированным const массивом - дело 5 минут (stdio.h + math.h). В чем вопрос то? :) Боитесь, что инициализированный const массив все равно будет размещен в ОЗУ? Вы, видимо, имеете в виду Visual Studio или нечто подобное? Такого не имею. Keil uVision4 - на нем можно? :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Вы, видимо, имеете в виду Visual Studio или нечто подобное? Такого не имею. Keil uVision4 - на нем можно? :rolleyes: :) Еще и как! Поднять консоль с stdio на stm32f103 и запустить в симуляторе, результат вывода в консоль скопипастить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Я попробовал в 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Можно ли это сделать при компиляции, расположив массив во flash? Меня вот это при компиляции смущает. Означает ли это, что размер массива заранее неизвестен, и только в момент компиляции вы хотите задавать? Если да, то это одна задача. Но поскольку звучит МатЛаб, то трудно поверить, что вы хотите вызывать его из Кейла. Значит считаете заранее, и используете в своем коде, как было предложено выше. Можно и руками убрать лишнюю точку с запятой. У меня была аналогичная задача с пересчетом температуры. Я расчитал таблицу на питоне, засунул в файл и использую. Так как в разных проектах диапазон температуры различен - часть массива ограничена ifdefом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Любой вариант годится, а размер массива просто задается макроопределением, для универсальности. Создать файл матлабом, или питоном, или экселом, или еще как-то - этот способ понятен. Так и сделаю. Интересно, как бы при компиляции заполнить массив по формуле? Макрофункциями, например? Ведь можно инициализировать текстом или числами. Научился записывать в одной строке несколько чисел. fprintf(fid, '%f, %f, %f, %f, \n ', C); Жаль, '\b' что-то не стирает последний символ (запятую). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
winipuh 0 4 октября, 2013 Опубликовано 4 октября, 2013 (изменено) · Жалоба Вы, видимо, имеете в виду 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 Вот как-то так... Изменено 4 октября, 2013 пользователем winipuh Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Шутите? :) Мне казалось, что у каждго эмбеддера должен быть и "десктопный" тулчейн. В конце концов можно спокойно и аккуратно отдебажить какие-нибудь алгоритмы (прям на чистом Си), а потом исходники просто и без всяких изменений можно переносить в "embedd" проект... Убедили. :) Установлю VisualStudio Express. Потом... завтра, послезавтра... :rolleyes: Пока же обошелся Matlab-ом. http://electronix.ru/forum/index.php?showt...t&p=1198430 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Убедили. :) Установлю VisualStudio Express. Потом... завтра, послезавтра... :rolleyes: ИМХО, для консольных мелочей лучше уж Watcom. Но компилятор для хоста вещь совершенно необходимая, Matlab его не заменит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба ИМХО, для консольных мелочей лучше уж Watcom. А по мне, C::B ещё лучше. Искаропки умеет компилить как консольные, так и win32 GUI, Qt, GTK, wxWidgets и многое другое. CygWin в комплекте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться