September 2017 Update
This commit is contained in:
parent
bba7bfd280
commit
ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions
|
|
@ -1,92 +0,0 @@
|
|||
#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,4 +0,0 @@
|
|||
f[] data is : -3 -6 -1 8 -6 3 -1 -9 -9 3 -2 5 2 -2 -7 -1
|
||||
deconv(g, h): -3 -6 -1 8 -6 3 -1 -9 -9 3 -2 5 2 -2 -7 -1
|
||||
h[] data is : -8 -9 -3 -1 -6 7
|
||||
deconv(g, f): -8 -9 -3 -1 -6 7
|
||||
27
Task/Deconvolution-1D/Kotlin/deconvolution-1d.kotlin
Normal file
27
Task/Deconvolution-1D/Kotlin/deconvolution-1d.kotlin
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
// version 1.1.3
|
||||
|
||||
fun deconv(g: DoubleArray, f: DoubleArray): DoubleArray {
|
||||
val fs = f.size
|
||||
val h = DoubleArray(g.size - fs + 1)
|
||||
for (n in h.indices) {
|
||||
h[n] = g[n]
|
||||
val lower = if (n >= fs) n - fs + 1 else 0
|
||||
for (i in lower until n) h[n] -= h[i] * f[n -i]
|
||||
h[n] /= f[0]
|
||||
}
|
||||
return h
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val h = doubleArrayOf(-8.0, -9.0, -3.0, -1.0, -6.0, 7.0)
|
||||
val f = doubleArrayOf(-3.0, -6.0, -1.0, 8.0, -6.0, 3.0, -1.0, -9.0,
|
||||
-9.0, 3.0, -2.0, 5.0, 2.0, -2.0, -7.0, -1.0)
|
||||
val g = doubleArrayOf(24.0, 75.0, 71.0, -34.0, 3.0, 22.0, -45.0,
|
||||
23.0, 245.0, 25.0, 52.0, 25.0, -67.0, -96.0,
|
||||
96.0, 31.0, 55.0, 36.0, 29.0, -43.0, -7.0)
|
||||
println("${h.map { it.toInt() }}")
|
||||
println("${deconv(g, f).map { it.toInt() }}")
|
||||
println()
|
||||
println("${f.map { it.toInt() }}")
|
||||
println("${deconv(g, h).map { it.toInt() }}")
|
||||
}
|
||||
20
Task/Deconvolution-1D/Phix/deconvolution-1d.phix
Normal file
20
Task/Deconvolution-1D/Phix/deconvolution-1d.phix
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
function deconv(sequence g, sequence f)
|
||||
integer lf = length(f)
|
||||
sequence h = repeat(0,length(g)-lf+1)
|
||||
for n = 1 to length(h) do
|
||||
atom e = g[n]
|
||||
for i=max(n-lf,0) to n-2 do
|
||||
e -= h[i+1] * f[n-i]
|
||||
end for
|
||||
h[n] = e/f[1]
|
||||
end for
|
||||
return h
|
||||
end function
|
||||
|
||||
constant h = {-8,-9,-3,-1,-6,7}
|
||||
constant f = {-3,-6,-1,8,-6,3,-1,-9,-9,3,-2,5,2,-2,-7,-1}
|
||||
constant g = {24,75,71,-34,3,22,-45,23,245,25,52,25,-67,
|
||||
-96,96,31,55,36,29,-43,-7}
|
||||
sequence r
|
||||
r = deconv(g, f) ?{r==h,r}
|
||||
r = deconv(g, h) ?{r==f,r}
|
||||
|
|
@ -22,6 +22,7 @@ def ToReducedRowEchelonForm( M ):
|
|||
lv = M[i][lead]
|
||||
M[i] = [ iv - lv*rv for rv,iv in zip(M[r],M[i])]
|
||||
lead += 1
|
||||
return M
|
||||
|
||||
def pmtx(mtx):
|
||||
print ('\n'.join(''.join(' %4s' % col for col in row) for row in mtx))
|
||||
|
|
|
|||
8
Task/Deconvolution-1D/Zkl/deconvolution-1d-1.zkl
Normal file
8
Task/Deconvolution-1D/Zkl/deconvolution-1d-1.zkl
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
var [const] GSL=Import("zklGSL"); // libGSL (GNU Scientific Library)
|
||||
fcn dconv1D(f,g){
|
||||
fsz,hsz:=f.len(), g.len() - fsz +1;
|
||||
A:=GSL.Matrix(g.len(),hsz);
|
||||
foreach n,fn in ([0..].zip(f)){ foreach rc in (hsz){ A[rc+n,rc]=fn } }
|
||||
h:=A.AxEQb(g);
|
||||
h
|
||||
}
|
||||
7
Task/Deconvolution-1D/Zkl/deconvolution-1d-2.zkl
Normal file
7
Task/Deconvolution-1D/Zkl/deconvolution-1d-2.zkl
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
f:=GSL.VectorFromData(-3,-6,-1,8,-6,3,-1,-9,-9,3,-2,5,2,-2,-7,-1);
|
||||
g:=GSL.VectorFromData(24,75,71,-34,3,22,-45,23,245,25,52,25,-67,-96,96,31,55,36,29,-43,-7);
|
||||
h:=dconv1D(f,g);
|
||||
h.format().println();
|
||||
|
||||
f:=dconv1D(h,g);
|
||||
f.format().println();
|
||||
11
Task/Deconvolution-1D/Zkl/deconvolution-1d-3.zkl
Normal file
11
Task/Deconvolution-1D/Zkl/deconvolution-1d-3.zkl
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
fcn deconv(g,f){
|
||||
flen, glen, delta:=f.len(), g.len(), glen - flen + 1;
|
||||
result:=List.createLong(delta); // allocate list with space for items
|
||||
foreach n in (delta){
|
||||
e:=g[n];
|
||||
lowerBound:=(if (n>=flen) n - flen + 1 else 0);
|
||||
foreach i in ([lowerBound .. n-1]){ e-=result[i]*f[n - i]; }
|
||||
result.append(e/f[0]);
|
||||
}
|
||||
result;
|
||||
}
|
||||
6
Task/Deconvolution-1D/Zkl/deconvolution-1d-4.zkl
Normal file
6
Task/Deconvolution-1D/Zkl/deconvolution-1d-4.zkl
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
h:=T(-8,-9,-3,-1,-6,7);
|
||||
f:=T(-3,-6,-1,8,-6,3,-1,-9,-9,3,-2,5,2,-2,-7,-1);
|
||||
g:=T(24,75,71,-34,3,22,-45,23,245,25,52,25,-67,
|
||||
-96,96,31,55,36,29,-43,-7);
|
||||
println(deconv(g, f) == h, " ", deconv(g, f));
|
||||
println(deconv(g, h) == f, " ", deconv(g, h));
|
||||
Loading…
Add table
Add a link
Reference in a new issue