uragan90 0 2 декабря, 2013 Опубликовано 2 декабря, 2013 · Жалоба Здравствуйте уважаемые! Написал такой вот код в keil 4.73 А он не компилируется не в какую, где может быть косяк??? #include <math.h> unsigned int Massine[8000]; typedef union{ int ch1_ch2; char ch[2]; }chn; void sinetest(void) { float ampvol_ch1 = 65; float period_ch1 = 20; //----------------------------------------- float ampvol_ch2 = 45; float period_ch2 = 30; //----------------------------------------- float pi = 3.14; int index = 8000; int i = 0; //----------------------------------------- chn channel; for(i=0; i<index; i++) { channel.ch[0] = 128 + (ampvol_ch1*sin(i*pi*period_ch1)); channel.ch[1] = 128 + (ampvol_ch2*sin(i*pi*period_ch2)); Massine[i] = channel.ch1_ch2; } } Интересует правильность синтексиса! А то я в майне вызываю эту функцию чтоб она заполнила массив, а код не компилируется! Но ведь с виду ошибок не вижу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 2 декабря, 2013 Опубликовано 2 декабря, 2013 · Жалоба Что за ошибка? Компиляции, сборки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 2 декабря, 2013 Опубликовано 2 декабря, 2013 · Жалоба Пишет что не нравится ему что float с int мешаю или типа того! но мне нужно синусойду в двух каналах по байту каждая запихать в слово двух байтовое Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andron86 0 2 декабря, 2013 Опубликовано 2 декабря, 2013 · Жалоба Пишет что не нравится ему что float с int мешаю или типа того! но мне нужно синусойду в двух каналах по байту каждая запихать в слово двух байтовое ну так правильно, (float)i сделайте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 2 декабря, 2013 Опубликовано 2 декабря, 2013 · Жалоба От этой ошибки удалось иавится! Теперь ругается на обьявление chn channel; пишет что ранее обьявлен мог быть... Да что за фигня то? union в кейле так и не удалось попробовать! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
winipuh 0 2 декабря, 2013 Опубликовано 2 декабря, 2013 (изменено) · Жалоба Теперь ругается на обьявление chn channel; пишет что ранее обьявлен мог быть... А Вы приведите тут варнинг как он есть, на английском. Попутно А Вы там с union не перемудрили? Надо то и всего Massine = ch[0] | ((unsigned int)ch[1] << 8) ... Зачем используете int для Massine, если на каждый сэмпл используется только 2 байта (по байту на канал). Оставшиеся 4000 байт врагу подарите? :) float pi = 3.14 — это не наш метод! Про дефайн "M_PI" в хедере math.h знаете? Как насчет такого кода (ver.2): #include <stdio.h> #include <stdlib.h> #define _USE_MATH_DEFINES // это нужно только для VisualStudio #include <math.h> typedef union { unsigned short data; struct { unsigned char left; unsigned char right; } chan; } stereo_sample_t; struct sine_param { float amp_vol; float period; }; static unsigned char get_sine_sample(const struct sine_param *p, int i) { return 128u + (unsigned char)(p->amp_vol * sin(M_PI * p->period * i)); } static void sine_test(stereo_sample_t buf[], int num_samples) { struct sine_param left_ch = {65, 20}; struct sine_param right_ch = {45, 30}; int i; for(i = 0; i < num_samples; i++) { buf[i].chan.left = get_sine_sample(&left_ch, i); buf[i].chan.right = get_sine_sample(&right_ch, i); } } int main(void) { stereo_sample_t Massine[8000]; sine_test(Massine, sizeof(Massine) / sizeof(Massine[0])); return 0; } Так вот немного приятнее... Изменено 2 декабря, 2013 пользователем winipuh Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 2 декабря, 2013 Опубликовано 2 декабря, 2013 (изменено) · Жалоба Спасибо!!! Ну может и перемудрил конечно! M_PI не знал спасибо! Автор! Поаккуратнее с цитированием! Для того, чтобы сказать "спасибо" не обязательно бездумно копировать весь предыдущий пост кнопкой "Reply". От себя добавлю, что если Вы так же грамотно и внимательно пишете на С, как на русском, то удивляться совершенно нечему... Изменено 2 декабря, 2013 пользователем Herz Избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 3 декабря, 2013 Опубликовано 3 декабря, 2013 · Жалоба winipuh Спасибо вам огромное!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 3 декабря, 2013 Опубликовано 3 декабря, 2013 · Жалоба Написал для теста в Dev-C++ код который бы должен был по идеи вывести значения в отдельный файл txt Но не прокатывает В файл пишется ерунда всякая, но не то что ожидалось... #include <iostream> #include <fstream> #include <math.h> using namespace std; typedef union { unsigned short data; struct { unsigned char left; unsigned char right; } chan; } stereo_sample_t; struct sine_param { float amp_vol; float period; }; static unsigned char get_sine_sample(const struct sine_param *p, int i) { return 128u + (unsigned char)(p->amp_vol * sin(M_PI * p->period * i)); } static int sine_test(stereo_sample_t buf[], int num_samples) { struct sine_param left_ch = {65, 20}; struct sine_param right_ch = {45, 30}; int i; for(i = 0; i < num_samples; i++) { buf[i].chan.left = get_sine_sample(&left_ch, i); buf[i].chan.right = get_sine_sample(&right_ch, i); } } int main(void) { ofstream File1; File1.open("C:/MasCH1.txt"); stereo_sample_t Massine[8000] = {0}; sine_test(Massine, sizeof(Massine) / sizeof(Massine[0])); for(int i = 0; i < sizeof(Massine) / sizeof(Massine[0]); i++) { File1 << Massine[i].data << endl; } File1.close(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
winipuh 0 3 декабря, 2013 Опубликовано 3 декабря, 2013 (изменено) · Жалоба В файл пишется ерунда всякая, но не то что ожидалось...А что именно Вы ожидали? Тут телепатов нет :) Для начала ampvol_ch1*sin(i*pi*period_ch1) 1) Есть понятие кол-во отсчетов в секунду — SampleRate (1/SampleRate — это интервал дискретизации) 2) Есть частота генерируемого синуса — Frequency (1/Frequency — это период синуса) Итого — i-ый отсчет синуса выражается так: A * sin(2 * PI * Freq * i / SampleRate) Дело за малым: 1) Перевести эту формулу в С/С++ 2) Подумать/подправить структуры данных, функции и т.д. (чтобы не засрать исходник)... :laughing: Изменено 3 декабря, 2013 пользователем winipuh Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 3 декабря, 2013 Опубликовано 3 декабря, 2013 · Жалоба Понемемаете мне нужна функция тестовая которая в массив сложила жы синус, два канала, причём первый канал был бы в старшем, а второй в младшем байтах двух байтового слова! И я мог бы обратится к этому массиву из других функций! Тоесть взять индекс массива mass; И в этом индексе массива были бы данные синуса для двух каналов. Ещё раз повторяю, что это тестовая функция и она нужна лишь для теста других функций в программе! В реале значения будут братся не из этой тестовой функции, а с реальных АЦП Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
winipuh 0 3 декабря, 2013 Опубликовано 3 декабря, 2013 · Жалоба Без обид, но... Вам сколько лет? :) Понемемаете мне нужна функция тестовая которая в массив сложила жы синус, два канала #include <iostream> #include <fstream> #define _USE_MATH_DEFINES #include <math.h> class SinGen { float amp; float phase_inc; public: SinGen(float amplitude, float frequency, unsigned int rate = 8000) { amp = amplitude; phase_inc = (float(2 * M_PI) * frequency) / rate; } unsigned char getSample(int i) { return 128u + (unsigned char)(amp * sin(phase_inc * i)); } }; typedef union { unsigned short data; struct { unsigned char left; unsigned char right; } chan; } stereo_sample_t; static void sine_test(stereo_sample_t *buf, int num_samples) { SinGen left_ch(65, 10); SinGen right_ch(45, 20); for(int i = 0; i < num_samples; i++) { buf[i].chan.left = left_ch.getSample(i); buf[i].chan.right = right_ch.getSample(i); } } int main(void) { using namespace std; enum {BUF_SIZE = 8000}; stereo_sample_t sine_buf[bUF_SIZE]; sine_test(sine_buf, BUF_SIZE); ofstream SinDataFile; SinDataFile.open("sin.txt"); for (int i = 0; i < BUF_SIZE; i++) { SinDataFile << i << '\t'; SinDataFile << (unsigned)sine_buf[i].chan.left << '\t' << (unsigned)sine_buf[i].chan.right; SinDataFile << endl; } SinDataFile.close(); return 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 3 декабря, 2013 Опубликовано 3 декабря, 2013 · Жалоба winipuh Да ничего страшного! Обзывайтесь :-) Я новичёк ещё в сим деле, хоть и стар уже!!! А вам Спасибо, за ваш труд!!!! Но пишу я на чистом "си" где нет никаких классов! И пишу пока как видите плохо, но я верю в то что когда нибуть стану писать значительно лучше Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 3 декабря, 2013 Опубликовано 3 декабря, 2013 · Жалоба Без обид, но... Вам сколько лет? :) не в какую синтексиса синусойду обьявление по идеи Понемемаете будут братся новичёк когда нибуть хоть и стар уже!!! не верю :1111493779: про запятые вообще молчу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uragan90 0 3 декабря, 2013 Опубликовано 3 декабря, 2013 · Жалоба toweroff Во дворе весь день стучат Двое стриженых внучат. Дед им вынес настоящий С круглой шляпкой молоток: - Вот, ребята, сбейте ящик Из распиленных досок. Яша стукнул по доске, А попало по руке. Больно пальцу - не беда, Так бывает иногда. Белой тряпочкой завязан Средний палец у него. Но и к деду ведь не сразу Приходило мастерство. Повнимательнее будь, К мастерству не лёгок путь! Взял Никита молоток И ударил ловко. Покосилась только вбок У гвоздя головка. Покосилась - не беда. Так бывает иногда. - Не беда, что у ребят, Как заметил кто-то, Ящик вышел кривоват, - Первая работа! Главное по спокойнее! Вы не дали не одного умного совета даже и на грамм, но умника стриите на целый киллограм! ВИНИПУХУ огромное спассибо за науку!!!!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться