Just another update
This commit is contained in:
parent
a25938f123
commit
00a190b0a6
6591 changed files with 94363 additions and 23227 deletions
|
|
@ -4,7 +4,8 @@ satisfying
|
|||
|
||||
:<math> G(n) = \sum_{m=-\infty}^{\infty} F(m) H(n-m) </math>
|
||||
|
||||
for all integers <math>\mathit{n}</math>. Assume <math>F(n)</math> can be non-zero only for <math>0</math> ≤ <math>\mathit{n}</math> ≤ <math>|\mathit{F}|</math>, where <math>|\mathit{F}|</math> is the "length" of <math>\mathit{F}</math>, and similarly for <math>\mathit{G}</math> and <math>\mathit{H}</math>, so that the functions can be modeled as finite sequences by identifying <math>f_0, f_1, f_2, \dots</math> with <math>F(0), F(1), F(2), \dots</math>, etc. Then for example, values of <math>|\mathit{F}| = 6</math> and <math>|\mathit{H}| = 5</math> would determine the following value of <math>\mathit{g}</math> by definition.
|
||||
for all integers <math>\mathit{n}</math>. Assume <math>F(n)</math> can be non-zero only for <math>0</math> ≤ <math>\mathit{n}</math> ≤ <math>|\mathit{F}|</math>, where <math>|\mathit{F}|</math> is the "length" of <math>\mathit{F}</math>, and similarly for <math>\mathit{G}</math> and <math>\mathit{H}</math>, so that the functions can be modeled as finite sequences by identifying <math>f_0, f_1, f_2, \dots</math> with <math>F(0), F(1), F(2), \dots</math>, etc.
|
||||
Then for example, values of <math>|\mathit{F}| = 6</math> and <math>|\mathit{H}| = 5</math> would determine the following value of <math>\mathit{g}</math> by definition.
|
||||
|
||||
:<math>
|
||||
\begin{array}{lllllllllll}
|
||||
|
|
|
|||
92
Task/Deconvolution-1D/C/deconvolution-1d.c
Normal file
92
Task/Deconvolution-1D/C/deconvolution-1d.c
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <complex.h>
|
||||
|
||||
double PI;
|
||||
typedef double complex cplx;
|
||||
|
||||
void _fft(cplx buf[], cplx out[], int n, int step)
|
||||
{
|
||||
if (step < n) {
|
||||
_fft(out, buf, n, step * 2);
|
||||
_fft(out + step, buf + step, n, step * 2);
|
||||
|
||||
for (int i = 0; i < n; i += 2 * step) {
|
||||
cplx t = cexp(-I * PI * i / n) * out[i + step];
|
||||
buf[i / 2] = out[i] + t;
|
||||
buf[(i + n)/2] = out[i] - t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void fft(cplx buf[], int n)
|
||||
{
|
||||
cplx out[n];
|
||||
for (int i = 0; i < n; i++) out[i] = buf[i];
|
||||
_fft(buf, out, n, 1);
|
||||
}
|
||||
|
||||
/* pad array length to power of two */
|
||||
cplx *pad_two(double g[], int len, int *ns)
|
||||
{
|
||||
int n = 1;
|
||||
if (*ns) n = *ns;
|
||||
else while (n < len) n *= 2;
|
||||
|
||||
cplx *buf = calloc(sizeof(cplx), n);
|
||||
for (int i = 0; i < len; i++) buf[i] = g[i];
|
||||
*ns = n;
|
||||
return buf;
|
||||
}
|
||||
|
||||
void deconv(double g[], int lg, double f[], int lf, double out[]) {
|
||||
int ns = 0;
|
||||
cplx *g2 = pad_two(g, lg, &ns);
|
||||
cplx *f2 = pad_two(f, lf, &ns);
|
||||
|
||||
fft(g2, ns);
|
||||
fft(f2, ns);
|
||||
|
||||
cplx h[ns];
|
||||
for (int i = 0; i < ns; i++) h[i] = g2[i] / f2[i];
|
||||
fft(h, ns);
|
||||
|
||||
for (int i = 0; i >= lf - lg; i--)
|
||||
out[-i] = h[(i + ns) % ns]/32;
|
||||
free(g2);
|
||||
free(f2);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
PI = atan2(1,1) * 4;
|
||||
double g[] = {24,75,71,-34,3,22,-45,23,245,25,52,25,-67,-96,96,31,55,36,29,-43,-7};
|
||||
double f[] = { -3,-6,-1,8,-6,3,-1,-9,-9,3,-2,5,2,-2,-7,-1 };
|
||||
double h[] = { -8,-9,-3,-1,-6,7 };
|
||||
|
||||
int lg = sizeof(g)/sizeof(double);
|
||||
int lf = sizeof(f)/sizeof(double);
|
||||
int lh = sizeof(h)/sizeof(double);
|
||||
|
||||
double h2[lh];
|
||||
double f2[lf];
|
||||
|
||||
printf("f[] data is : ");
|
||||
for (int i = 0; i < lf; i++) printf(" %g", f[i]);
|
||||
printf("\n");
|
||||
|
||||
printf("deconv(g, h): ");
|
||||
deconv(g, lg, h, lh, f2);
|
||||
for (int i = 0; i < lf; i++) printf(" %g", f2[i]);
|
||||
printf("\n");
|
||||
|
||||
printf("h[] data is : ");
|
||||
for (int i = 0; i < lh; i++) printf(" %g", h[i]);
|
||||
printf("\n");
|
||||
|
||||
printf("deconv(g, f): ");
|
||||
deconv(g, lg, f, lf, h2);
|
||||
for (int i = 0; i < lh; i++) printf(" %g", h2[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
|
@ -1,26 +1,29 @@
|
|||
import java.util.Arrays;
|
||||
|
||||
public class Deconvolution1D {
|
||||
public static double[] deconv(double[] f, double[] g) {
|
||||
double[] h = new double[g.length - f.length + 1];
|
||||
public static int[] deconv(int[] g, int[] f) {
|
||||
int[] h = new int[g.length - f.length + 1];
|
||||
for (int n = 0; n < h.length; n++) {
|
||||
h[n] = g[n];
|
||||
int lower = Math.max(n - f.length + 1, 0);
|
||||
for (int i = lower; i < n; i++)
|
||||
h[n] -= h[i] * f[n-i];
|
||||
h[n] -= h[i] * f[n - i];
|
||||
h[n] /= f[0];
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
double[] h = {-8, -9, -3, -1, -6, 7};
|
||||
double[] f = {-3, -6, -1, 8, -6, 3, -1, -9, -9, 3, -2, 5, 2, -2, -7, -1};
|
||||
double[] g = {24, 75, 71, -34, 3, 22, -45, 23, 245, 25, 52, 25, -67, -96,
|
||||
96, 31, 55, 36, 29, -43, -7};
|
||||
System.out.println(Arrays.toString(h));
|
||||
System.out.println(Arrays.toString(deconv(g, f)));
|
||||
System.out.println(Arrays.toString(f));
|
||||
System.out.println(Arrays.toString(deconv(g, h)));
|
||||
int[] h = { -8, -9, -3, -1, -6, 7 };
|
||||
int[] f = { -3, -6, -1, 8, -6, 3, -1, -9, -9, 3, -2, 5, 2, -2, -7, -1 };
|
||||
int[] g = { 24, 75, 71, -34, 3, 22, -45, 23, 245, 25, 52, 25, -67, -96,
|
||||
96, 31, 55, 36, 29, -43, -7 };
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("h = " + Arrays.toString(h) + "\n");
|
||||
sb.append("deconv(g, f) = " + Arrays.toString(deconv(g, f)) + "\n");
|
||||
sb.append("f = " + Arrays.toString(f) + "\n");
|
||||
sb.append("deconv(g, h) = " + Arrays.toString(deconv(g, h)) + "\n");
|
||||
System.out.println(sb.toString());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue