filtr medianowy w funkcji sinus

0

Problem polega na tym, że robie coś nie tak w algorytmie dotyczącym filtrowania zaszumionej funkcji sinus.
Chodzi o funkcję filtr medianowy. W skrócie bierzemy 5 kolejnych wartości, sortujemy je i bierzemy wartość środkową czyli medianę i to jest nasza przefiltrowana wartosc. Coś się dzieje, ze wywala mi same 0. Do tego Program ma zapisywać wartosci do csv, jednak floaty zapisuje mi z kropką a excel czyta przecinki. Ktoś ma pomysł jak te 2 problemy rozwiązać?

void filtr_medianowy(int p, float *sinus_szum, float *filtr_on)

{
    int i, j ;
    int a,b ;
    float y ;
    float pomoc[5] ;
    for(i=3; i<=p; i++)
    {
        for(j=0; j<=5; j++)
        {
            pomoc[j]=sinus_szum[i-2] ;

        }
        for( a=0; a<5; a++)
            for( b=1; b<p-a; b++)
            {

                if(pomoc[b]>pomoc[b+1])
                {
                    y=pomoc[b] ;
                    pomoc[b]=pomoc[b+1] ;
                    pomoc[b+1] = y ;
                }
                    {

                        pomoc[3]=filtr_on[i] ;
                    }
                }
    }
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

void tablica_czasu(int p, float tp, float m, float *czas)
{
    int i ;
    for(i=0 ; i<=p ; i++)
        czas[i] = tp+ i*m ;
}
void tablica_sinusa(int p, float A, float *czas, float *sin1, float cz, float fi)
{
    int i ;
    for(i=0; i<=p; i++)
        sin1[i]= A*sin(2*M_PI*(czas[i])/cz+fi) ;
}
void filtr_medianowy(int p, float *sinus_szum, float *filtr_on)

{
    int i, j ;
    int a,b ;
    float y ;
    float pomoc[5] ;
    for(i=3; i<=p; i++)
    {
        for(j=0; j<=5; j++)
        {
            pomoc[j]=sinus_szum[i-2] ;

        }
        for( a=0; a<5; a++)
            for( b=1; b<p-a; b++)
            {

                if(pomoc[b]>pomoc[b+1])
                {
                    y=pomoc[b] ;
                    pomoc[b]=pomoc[b+1] ;
                    pomoc[b+1] = y ;
                }
                    {

                        pomoc[3]=filtr_on[i] ;
                    }
                }
    }
}

void tablica_szumu(int p, float *tablica_szumu)

{
    srand(time(NULL));
    int i ;

    for(i=1; i<p; i++)
    {
        tablica_szumu[i]=(rand()%10 );
    }
    int max;
    max=tablica_szumu[0];
    for(i=0; i<p; i++)
    {
        if(tablica_szumu[i]>max)
            max=tablica_szumu[i];
    }

    for(i=1; i<p; i++)
    {
        tablica_szumu[i]=(tablica_szumu[i] / max);
    }
}
void drukuj(float *tablica, int p)
{
    int i ;
    for(i=0; i<p; i++)
    {

        printf("%f", tablica[i]) ;
        puts("") ;
    }
}



void zapisuj(int p, float *czas, float *szum, float *sinus)
{

    int i;

    FILE*plik;
    plik=fopen("plik.csv", "w");
    for(i=0; i<p; i++)
    {
        fprintf(plik, "%f;%f;%f;%f\n", szum[i], sinus[i],czas[i],sinus[i]+szum[i] );

    }

    fclose(plik);
}


int main()
{
    int i ;
    float a,tp,tk,f,fi ;
    float cz,p,m,fo;
    puts("PODAJ AMPLITUDE") ;
    scanf("%f", &a);
    puts("PODAJ CZAS POCZATKOWY") ;
    scanf("%f", &tp);
    puts("PODAJ CZAS KONCOWY") ;
    scanf("%f", &tk);
    puts("PODAJ CZESTOTLIWOSC");
    scanf("%f", &f);
    puts("PODAJ PRZESUNIECIE");
    scanf("%f", &fi);
    fo=2*f ;
    m=1/fo ;
    cz=tk-tp ;
    p = cz/m ;
    int y = p ;
    float *sinus ;
    float *czas ;
    float *szum ;
    float *filtr_on ;
    float *sinus_szum ;
    filtr_on=calloc(p,sizeof(float));
    czas=calloc(p, sizeof(float));
    sinus=calloc(p,sizeof(float));
    szum=calloc(p, sizeof(float));
    sinus_szum=calloc(p,sizeof(float)) ;
    tablica_czasu(y,tp,m,czas) ;
    tablica_sinusa(y,a,czas,sinus,cz,fi) ;
    tablica_szumu(y,szum) ;
    zapisuj( y,czas,szum,sinus) ;
    for(i=0; i<=p; i++)
    {
        sinus_szum[i]=sinus[i]+szum[i] ;
    }
    drukuj(sinus_szum,y) ;
    puts("***") ;
    drukuj(filtr_on,y) ;
    return 0 ;
}


0

Pisząc int tab[n]; tworzysz tablicę mającą n elementów o indeksach 0, 1, 2, 3, ..., n-1.

0

Wszystkie tablce w programie są dynamicznie alokowane, z wyjątiem jednej pomocniczej[5], do które zapsiuje 5 elementów z ktotrych biorę medianę

0

Ale co to ma do rzeczy?

0

No dobra, pozmieniałem to, ale program dalej krzaczy :(

void filtr_medianowy(int p, float *sinus_szum, float *filtr_on)
{
    int i, j ;
    int a,b ;
    float y ;
    float pomoc[5] ;
    for(i=2; i<=p; i++)
    {
        for(j=0; j<=4; j++)
        {
            pomoc[j]=sinus_szum[i-2] ;

        }
        for( a=0; a<4; a++)

            for( b=1; b<(p-a); b++)
            {

                if(pomoc[b]>pomoc[b+1])
                {
                    y=pomoc[b] ;
                    pomoc[b]=pomoc[b+1] ;
                    pomoc[b+1] = y ;
                }
                    {

                        pomoc[2]=filtr_on[i] ;
                    }
                }
    }
}
0

Nie tylko w tej jednej funkcji miałeś off by one.

1 użytkowników online, w tym zalogowanych: 0, gości: 1