Convoluzione di due segnali discreti in C
Un saluto a tutti
Tra poco comincerò il semestre di Segnali e Sistemi, quel poco che so l'ho studiato tempo fa da autodidatta..
Ci sono concetti che mi ricordo ed altri no, alcune cose che ho tralasciato e altre che penso di non aver appreso a pieno (forse la convoluzione è uno di questi) quindi sto ripassando e studiando in anticipo.
Sto ripassando sul libro Signals & Systems 2nd Edition by Oppenheim, Willsky e Nawab, e sono arrivato al capitolo 2 "Linear Time Invariant Systems", nel quale viene esposto un esempio di una convoluzione tra due segnali discreti:
![y[n] = x[n] * h[n] y[n] = x[n] * h[n]](/forum/latexrender/pictures/d8a48b2d27a26d033ead94bdc39c5cac.png)
La rappresentazione grafica dei segnali e della convoluzione è questa:
Dove:
![y[n] = x[0]h[n - 0] + x[1]h[n-1] = 0.5h[n] + 2h[n-1] y[n] = x[0]h[n - 0] + x[1]h[n-1] = 0.5h[n] + 2h[n-1]](/forum/latexrender/pictures/89133a4148eb91b480e0d71d4481427c.png)
Per chi possiede questo famoso (e stupendo a mio modesto parere) libro, l'esempio è il 2.1 a pag. 80
E quindi mi sono messo di mio conto ed ho voluto farlo in C.
Lo so che potrei andare su Google e scrivere "C convolution" o spulciare il codice sorgente di qualche audio player con effetti speciali, e questo sarebbe quanto basta a scopiazzare e non imparare, ma questo non è il mio obiettivo.
Ecco che ho scritto questo programmino, che è un po' fatto su misura per questo esempio, ma l'importante è rassicurarmi di aver capito bene l'implementazione.
E questo è l'output, che coincide con l'esempio del libro.
Ovviamente più che interessarmi il risultato dei valori ed esultare tutto contento, mi interessa essere sicuro di aver fatto bene, e quindi di aver capito bene.
Chiedo scusa per eventuali castronerie varie.
Ringrazio in anticipo.
Simo
Tra poco comincerò il semestre di Segnali e Sistemi, quel poco che so l'ho studiato tempo fa da autodidatta..
Ci sono concetti che mi ricordo ed altri no, alcune cose che ho tralasciato e altre che penso di non aver appreso a pieno (forse la convoluzione è uno di questi) quindi sto ripassando e studiando in anticipo.
Sto ripassando sul libro Signals & Systems 2nd Edition by Oppenheim, Willsky e Nawab, e sono arrivato al capitolo 2 "Linear Time Invariant Systems", nel quale viene esposto un esempio di una convoluzione tra due segnali discreti:
![y[n] = x[n] * h[n] y[n] = x[n] * h[n]](/forum/latexrender/pictures/d8a48b2d27a26d033ead94bdc39c5cac.png)
La rappresentazione grafica dei segnali e della convoluzione è questa:
Dove:
![y[n] = x[0]h[n - 0] + x[1]h[n-1] = 0.5h[n] + 2h[n-1] y[n] = x[0]h[n - 0] + x[1]h[n-1] = 0.5h[n] + 2h[n-1]](/forum/latexrender/pictures/89133a4148eb91b480e0d71d4481427c.png)
Per chi possiede questo famoso (e stupendo a mio modesto parere) libro, l'esempio è il 2.1 a pag. 80
E quindi mi sono messo di mio conto ed ho voluto farlo in C.
Lo so che potrei andare su Google e scrivere "C convolution" o spulciare il codice sorgente di qualche audio player con effetti speciali, e questo sarebbe quanto basta a scopiazzare e non imparare, ma questo non è il mio obiettivo.
Ecco che ho scritto questo programmino, che è un po' fatto su misura per questo esempio, ma l'importante è rassicurarmi di aver capito bene l'implementazione.
- Codice: Seleziona tutto
#include <stdio.h>
#define NX 2
#define NY 3
int main(void)
{
int n = 0;
int k = 0;
double h[NY] = {1.0, 1.0, 1.0};
double x[NX] = {0.5, 2.0};
double y[NY + 1] = {0};
for(n = 0; n < NY + 1; n++)
{
for(k = 0; k < NX; k++)
{
if(n >= k)
{
/* printf("x[%d]:%.2f\th[%d]:%.2f\ta:%.2f\n", k, x[k], n-k, h[n-k]); */
y[n] += x[k]*h[n - k];
}
}
printf("y[%d] = %.2f\n", n, y[n]);
}
return 0;
}
E questo è l'output, che coincide con l'esempio del libro.
- Codice: Seleziona tutto
y[0] = 0.50
y[1] = 2.50
y[2] = 2.50
y[3] = 2.00
Ovviamente più che interessarmi il risultato dei valori ed esultare tutto contento, mi interessa essere sicuro di aver fatto bene, e quindi di aver capito bene.
Chiedo scusa per eventuali castronerie varie.
Ringrazio in anticipo.
Simo

, e questo è un esempio (spartano) che ho scritto:
e dei suoi indici..
con pochi campioni oppure
e