Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Злой код
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
uragan90
Здравствуйте уважаемые!
Написал такой вот код в 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
Что за ошибка? Компиляции, сборки?
uragan90
Пишет что не нравится ему что float с int мешаю или типа того!
но мне нужно синусойду в двух каналах по байту каждая запихать в слово двух байтовое
andron86
Цитата(uragan90 @ Dec 2 2013, 17:08) *
Пишет что не нравится ему что float с int мешаю или типа того!
но мне нужно синусойду в двух каналах по байту каждая запихать в слово двух байтовое

ну так правильно, (float)i сделайте
uragan90
От этой ошибки удалось иавится!
Теперь ругается на обьявление
chn channel;
пишет что ранее обьявлен мог быть...
Да что за фигня то?

union
в кейле так и не удалось попробовать!
winipuh
Цитата(uragan90 @ Dec 2 2013, 20:59) *
Теперь ругается на обьявление chn channel; пишет что ранее обьявлен мог быть...

А Вы приведите тут варнинг как он есть, на английском.

Попутно
  1. А Вы там с union не перемудрили? Надо то и всего Massine[i] = ch[0] | ((unsigned int)ch[1] << 8) ...
  2. Зачем используете int для Massine, если на каждый сэмпл используется только 2 байта (по байту на канал).
    Оставшиеся 4000 байт врагу подарите? sm.gif
  3. float pi = 3.14 — это не наш метод! Про дефайн "M_PI" в хедере math.h знаете?
  4. Как насчет такого кода (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

Спасибо!!!
Ну может и перемудрил конечно!
M_PI не знал спасибо!

Автор! Поаккуратнее с цитированием! Для того, чтобы сказать "спасибо" не обязательно бездумно копировать весь предыдущий пост кнопкой "Reply".
От себя добавлю, что если Вы так же грамотно и внимательно пишете на С, как на русском, то удивляться совершенно нечему...
uragan90
winipuh
Спасибо вам огромное!!!
uragan90
Написал для теста в 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
Цитата(uragan90 @ Dec 3 2013, 17:50) *
В файл пишется ерунда всякая, но не то что ожидалось...
А что именно Вы ожидали? Тут телепатов нет sm.gif

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


Цитата(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
winipuh
Да ничего страшного!
Обзывайтесь :-)
Я новичёк ещё в сим деле, хоть и стар уже!!!
А вам Спасибо, за ваш труд!!!!

Но пишу я на чистом "си" где нет никаких классов!

И пишу пока как видите плохо, но я верю в то что когда нибуть стану писать значительно лучше
toweroff
Цитата(winipuh @ Dec 3 2013, 20:24) *
Без обид, но... Вам сколько лет? sm.gif


Цитата(uragan90)
не в какую
синтексиса
синусойду
обьявление
по идеи
Понемемаете
будут братся
новичёк
когда нибуть


Цитата(uragan90)
хоть и стар уже!!!

не верю 1111493779.gif

про запятые вообще молчу
uragan90
toweroff

Во дворе весь день стучат
Двое стриженых внучат.

Дед им вынес настоящий
С круглой шляпкой молоток:
- Вот, ребята, сбейте ящик
Из распиленных досок.

Яша стукнул по доске,
А попало по руке.

Больно пальцу - не беда,
Так бывает иногда.

Белой тряпочкой завязан
Средний палец у него.
Но и к деду ведь не сразу
Приходило мастерство.

Повнимательнее будь,
К мастерству не лёгок путь!

Взял Никита молоток
И ударил ловко.
Покосилась только вбок
У гвоздя головка.

Покосилась - не беда.
Так бывает иногда.

- Не беда, что у ребят,
Как заметил кто-то,
Ящик вышел кривоват, -
Первая работа!

Главное по спокойнее!
Вы не дали не одного умного совета даже и на грамм, но умника стриите на целый киллограм!


ВИНИПУХУ огромное спассибо за науку!!!!!!
toweroff
Я задал один вопрос - кто выдал ошибку.
На него не получен ответ. Читать безграмотные сообщения - лень. Общаться дальше - нет желания
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.