Полная версия этой страницы:
Злой код
uragan90
Dec 2 2013, 16:02
Здравствуйте уважаемые!
Написал такой вот код в 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
Dec 2 2013, 16:05
Что за ошибка? Компиляции, сборки?
uragan90
Dec 2 2013, 16:08
Пишет что не нравится ему что float с int мешаю или типа того!
но мне нужно синусойду в двух каналах по байту каждая запихать в слово двух байтовое
andron86
Dec 2 2013, 16:13
Цитата(uragan90 @ Dec 2 2013, 17:08)

Пишет что не нравится ему что float с int мешаю или типа того!
но мне нужно синусойду в двух каналах по байту каждая запихать в слово двух байтовое
ну так правильно, (float)i сделайте
uragan90
Dec 2 2013, 16:59
От этой ошибки удалось иавится!
Теперь ругается на обьявление
chn channel;
пишет что ранее обьявлен мог быть...
Да что за фигня то?
union
в кейле так и не удалось попробовать!
winipuh
Dec 2 2013, 17:29
Цитата(uragan90 @ Dec 2 2013, 20:59)

Теперь ругается на обьявление chn channel; пишет что ранее обьявлен мог быть...
А Вы приведите тут варнинг как он есть, на английском.
Попутно
- А Вы там с union не перемудрили? Надо то и всего Massine[i] = 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;
}
Так вот немного приятнее...
uragan90
Dec 2 2013, 18:17
Спасибо!!!
Ну может и перемудрил конечно!
M_PI не знал спасибо!
Автор! Поаккуратнее с цитированием! Для того, чтобы сказать "спасибо" не обязательно бездумно копировать весь предыдущий пост кнопкой "Reply".
От себя добавлю, что если Вы так же грамотно и внимательно пишете на С, как на русском, то удивляться совершенно нечему...
uragan90
Dec 3 2013, 12:39
winipuh
Спасибо вам огромное!!!
uragan90
Dec 3 2013, 13:50
Написал для теста в 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
Dec 3 2013, 15:49
Цитата(uragan90 @ Dec 3 2013, 17:50)

В файл пишется ерунда всякая, но не то что ожидалось...
А что именно Вы ожидали? Тут телепатов нет

Для начала
Цитата
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) Подумать/подправить структуры данных, функции и т.д. (чтобы не засрать исходник)...
uragan90
Dec 3 2013, 16:11
Понемемаете мне нужна функция тестовая которая в массив сложила жы синус, два канала, причём первый канал был бы в старшем, а второй в младшем байтах двух байтового слова!
И я мог бы обратится к этому массиву из других функций!
Тоесть взять индекс массива mass[i];
И в этом индексе массива были бы данные синуса для двух каналов.
Ещё раз повторяю, что это тестовая функция и она нужна лишь для теста других функций в программе!
В реале значения будут братся не из этой тестовой функции, а с реальных АЦП
winipuh
Dec 3 2013, 16:24
Без обид, но... Вам сколько лет?

Цитата(uragan90 @ Dec 3 2013, 20:11)

Понемемаете мне нужна функция тестовая которая в массив сложила жы синус, два канала
CODE
#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
Dec 3 2013, 16:57
winipuh
Да ничего страшного!
Обзывайтесь :-)
Я новичёк ещё в сим деле, хоть и стар уже!!!
А вам Спасибо, за ваш труд!!!!
Но пишу я на чистом "си" где нет никаких классов!
И пишу пока как видите плохо, но я верю в то что когда нибуть стану писать значительно лучше
toweroff
Dec 3 2013, 17:00
Цитата(winipuh @ Dec 3 2013, 20:24)

Без обид, но... Вам сколько лет?

Цитата(uragan90)
не в какую
синтексиса
синусойду
обьявление
по идеи
Понемемаете
будут братся
новичёк
когда нибуть
Цитата(uragan90)
хоть и стар уже!!!
не верю
про запятые вообще молчу
uragan90
Dec 3 2013, 18:04
toweroff
Во дворе весь день стучат
Двое стриженых внучат.
Дед им вынес настоящий
С круглой шляпкой молоток:
- Вот, ребята, сбейте ящик
Из распиленных досок.
Яша стукнул по доске,
А попало по руке.
Больно пальцу - не беда,
Так бывает иногда.
Белой тряпочкой завязан
Средний палец у него.
Но и к деду ведь не сразу
Приходило мастерство.
Повнимательнее будь,
К мастерству не лёгок путь!
Взял Никита молоток
И ударил ловко.
Покосилась только вбок
У гвоздя головка.
Покосилась - не беда.
Так бывает иногда.
- Не беда, что у ребят,
Как заметил кто-то,
Ящик вышел кривоват, -
Первая работа!
Главное по спокойнее!
Вы не дали не одного умного совета даже и на грамм, но умника стриите на целый киллограм!
ВИНИПУХУ огромное спассибо за науку!!!!!!
toweroff
Dec 3 2013, 20:32
Я задал один вопрос - кто выдал ошибку.
На него не получен ответ. Читать безграмотные сообщения - лень. Общаться дальше - нет желания
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.