webRTC中回声消除(AEC)模块编译时aec_rdft.c文件报错:
webRTC中回声消除(AEC)模块编译时aec_rdft.c文件报错。
原因是:
局部变量ip跟全局变量冲突的问题,可以将局部变量重新命名一下,就可以通过编译了。
aec_rdft.c修改以后文件代码为:
/*
* http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
* Copyright Takuya OOURA, 1996-2001
*
* You may use, copy, modify and distribute this code for any purpose (include
* commercial use) and without fee. Please refer to this package when you modify
* this code.
*
* Changes by the WebRTC authors:
* - Trivial type modifications.
* - Minimal code subset to do rdft of length 128.
* - Optimizations because of known length.
*
* All changes are covered by the WebRTC license and IP grant:
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/ #include "webrtc/modules/audio_processing/aec/aec_rdft.h" #include <math.h> #include "webrtc/system_wrappers/interface/cpu_features_wrapper.h"
#include "webrtc/typedefs.h" // constants shared by all paths (C, SSE2).
float rdft_w[];
// constants used by the C path.
float rdft_wk3ri_first[];
float rdft_wk3ri_second[];
// constants used by SSE2 but initialized in C path.
ALIGN16_BEG float ALIGN16_END rdft_wk1r[];
ALIGN16_BEG float ALIGN16_END rdft_wk2r[];
ALIGN16_BEG float ALIGN16_END rdft_wk3r[];
ALIGN16_BEG float ALIGN16_END rdft_wk1i[];
ALIGN16_BEG float ALIGN16_END rdft_wk2i[];
ALIGN16_BEG float ALIGN16_END rdft_wk3i[];
ALIGN16_BEG float ALIGN16_END cftmdl_wk1r[]; static int ip[]; static void bitrv2_32(int* ip1, float* a) {
const int n = ;
int j, j1, k, k1, m, m2;
float xr, xi, yr, yi; ip1[] = ;
{
int l = n;
m = ;
while ((m << ) < l) {
l >>= ;
for (j = ; j < m; j++) {
ip1[m + j] = ip1[j] + l;
}
m <<= ;
}
}
m2 = * m;
for (k = ; k < m; k++) {
for (j = ; j < k; j++) {
j1 = * j + ip1[k];
k1 = * k + ip1[j];
xr = a[j1];
xi = a[j1 + ];
yr = a[k1];
yi = a[k1 + ];
a[j1] = yr;
a[j1 + ] = yi;
a[k1] = xr;
a[k1 + ] = xi;
j1 += m2;
k1 += * m2;
xr = a[j1];
xi = a[j1 + ];
yr = a[k1];
yi = a[k1 + ];
a[j1] = yr;
a[j1 + ] = yi;
a[k1] = xr;
a[k1 + ] = xi;
j1 += m2;
k1 -= m2;
xr = a[j1];
xi = a[j1 + ];
yr = a[k1];
yi = a[k1 + ];
a[j1] = yr;
a[j1 + ] = yi;
a[k1] = xr;
a[k1 + ] = xi;
j1 += m2;
k1 += * m2;
xr = a[j1];
xi = a[j1 + ];
yr = a[k1];
yi = a[k1 + ];
a[j1] = yr;
a[j1 + ] = yi;
a[k1] = xr;
a[k1 + ] = xi;
}
j1 = * k + m2 + ip1[k];
k1 = j1 + m2;
xr = a[j1];
xi = a[j1 + ];
yr = a[k1];
yi = a[k1 + ];
a[j1] = yr;
a[j1 + ] = yi;
a[k1] = xr;
a[k1 + ] = xi;
}
} static void bitrv2_128(float* a) {
/*
Following things have been attempted but are no faster:
(a) Storing the swap indexes in a LUT (index calculations are done
for 'free' while waiting on memory/L1).
(b) Consolidate the load/store of two consecutive floats by a 64 bit
integer (execution is memory/L1 bound).
(c) Do a mix of floats and 64 bit integer to maximize register
utilization (execution is memory/L1 bound).
(d) Replacing ip[i] by ((k<<31)>>25) + ((k >> 1)<<5).
(e) Hard-coding of the offsets to completely eliminates index
calculations.
*/ unsigned int j, j1, k, k1;
float xr, xi, yr, yi; static const int ip2[] = {, , , };
for (k = ; k < ; k++) {
for (j = ; j < k; j++) {
j1 = * j + ip2[k];
k1 = * k + ip2[j];
xr = a[j1 + ];
xi = a[j1 + ];
yr = a[k1 + ];
yi = a[k1 + ];
a[j1 + ] = yr;
a[j1 + ] = yi;
a[k1 + ] = xr;
a[k1 + ] = xi;
j1 += ;
k1 += ;
xr = a[j1 + ];
xi = a[j1 + ];
yr = a[k1 + ];
yi = a[k1 + ];
a[j1 + ] = yr;
a[j1 + ] = yi;
a[k1 + ] = xr;
a[k1 + ] = xi;
j1 += ;
k1 -= ;
xr = a[j1 + ];
xi = a[j1 + ];
yr = a[k1 + ];
yi = a[k1 + ];
a[j1 + ] = yr;
a[j1 + ] = yi;
a[k1 + ] = xr;
a[k1 + ] = xi;
j1 += ;
k1 += ;
xr = a[j1 + ];
xi = a[j1 + ];
yr = a[k1 + ];
yi = a[k1 + ];
a[j1 + ] = yr;
a[j1 + ] = yi;
a[k1 + ] = xr;
a[k1 + ] = xi;
}
j1 = * k + + ip2[k];
k1 = j1 + ;
xr = a[j1 + ];
xi = a[j1 + ];
yr = a[k1 + ];
yi = a[k1 + ];
a[j1 + ] = yr;
a[j1 + ] = yi;
a[k1 + ] = xr;
a[k1 + ] = xi;
}
} static void makewt_32(void) {
const int nw = ;
int j, nwh;
float delta, x, y; ip[] = nw;
ip[] = ;
nwh = nw >> ;
delta = atanf(1.0f) / nwh;
rdft_w[] = ;
rdft_w[] = ;
rdft_w[nwh] = cosf(delta * nwh);
rdft_w[nwh + ] = rdft_w[nwh];
for (j = ; j < nwh; j += ) {
x = cosf(delta * j);
y = sinf(delta * j);
rdft_w[j] = x;
rdft_w[j + ] = y;
rdft_w[nw - j] = y;
rdft_w[nw - j + ] = x;
}
bitrv2_32(ip + , rdft_w); // pre-calculate constants used by cft1st_128 and cftmdl_128...
cftmdl_wk1r[] = rdft_w[];
cftmdl_wk1r[] = rdft_w[];
cftmdl_wk1r[] = rdft_w[];
cftmdl_wk1r[] = -rdft_w[];
{
int k1; for (k1 = , j = ; j < ; j += , k1 += ) {
const int k2 = * k1;
const float wk2r = rdft_w[k1 + ];
const float wk2i = rdft_w[k1 + ];
float wk1r, wk1i;
// ... scalar version.
wk1r = rdft_w[k2 + ];
wk1i = rdft_w[k2 + ];
rdft_wk3ri_first[k1 + ] = wk1r - * wk2i * wk1i;
rdft_wk3ri_first[k1 + ] = * wk2i * wk1r - wk1i;
wk1r = rdft_w[k2 + ];
wk1i = rdft_w[k2 + ];
rdft_wk3ri_second[k1 + ] = wk1r - * wk2r * wk1i;
rdft_wk3ri_second[k1 + ] = * wk2r * wk1r - wk1i;
// ... vector version.
rdft_wk1r[k2 + ] = rdft_w[k2 + ];
rdft_wk1r[k2 + ] = rdft_w[k2 + ];
rdft_wk1r[k2 + ] = rdft_w[k2 + ];
rdft_wk1r[k2 + ] = rdft_w[k2 + ];
rdft_wk2r[k2 + ] = rdft_w[k1 + ];
rdft_wk2r[k2 + ] = rdft_w[k1 + ];
rdft_wk2r[k2 + ] = -rdft_w[k1 + ];
rdft_wk2r[k2 + ] = -rdft_w[k1 + ];
rdft_wk3r[k2 + ] = rdft_wk3ri_first[k1 + ];
rdft_wk3r[k2 + ] = rdft_wk3ri_first[k1 + ];
rdft_wk3r[k2 + ] = rdft_wk3ri_second[k1 + ];
rdft_wk3r[k2 + ] = rdft_wk3ri_second[k1 + ];
rdft_wk1i[k2 + ] = -rdft_w[k2 + ];
rdft_wk1i[k2 + ] = rdft_w[k2 + ];
rdft_wk1i[k2 + ] = -rdft_w[k2 + ];
rdft_wk1i[k2 + ] = rdft_w[k2 + ];
rdft_wk2i[k2 + ] = -rdft_w[k1 + ];
rdft_wk2i[k2 + ] = rdft_w[k1 + ];
rdft_wk2i[k2 + ] = -rdft_w[k1 + ];
rdft_wk2i[k2 + ] = rdft_w[k1 + ];
rdft_wk3i[k2 + ] = -rdft_wk3ri_first[k1 + ];
rdft_wk3i[k2 + ] = rdft_wk3ri_first[k1 + ];
rdft_wk3i[k2 + ] = -rdft_wk3ri_second[k1 + ];
rdft_wk3i[k2 + ] = rdft_wk3ri_second[k1 + ];
}
}
} static void makect_32(void) {
float* c = rdft_w + ;
const int nc = ;
int j, nch;
float delta; ip[] = nc;
nch = nc >> ;
delta = atanf(1.0f) / nch;
c[] = cosf(delta * nch);
c[nch] = 0.5f * c[];
for (j = ; j < nch; j++) {
c[j] = 0.5f * cosf(delta * j);
c[nc - j] = 0.5f * sinf(delta * j);
}
} static void cft1st_128_C(float* a) {
const int n = ;
int j, k1, k2;
float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; x0r = a[] + a[];
x0i = a[] + a[];
x1r = a[] - a[];
x1i = a[] - a[];
x2r = a[] + a[];
x2i = a[] + a[];
x3r = a[] - a[];
x3i = a[] - a[];
a[] = x0r + x2r;
a[] = x0i + x2i;
a[] = x0r - x2r;
a[] = x0i - x2i;
a[] = x1r - x3i;
a[] = x1i + x3r;
a[] = x1r + x3i;
a[] = x1i - x3r;
wk1r = rdft_w[];
x0r = a[] + a[];
x0i = a[] + a[];
x1r = a[] - a[];
x1i = a[] - a[];
x2r = a[] + a[];
x2i = a[] + a[];
x3r = a[] - a[];
x3i = a[] - a[];
a[] = x0r + x2r;
a[] = x0i + x2i;
a[] = x2i - x0i;
a[] = x0r - x2r;
x0r = x1r - x3i;
x0i = x1i + x3r;
a[] = wk1r * (x0r - x0i);
a[] = wk1r * (x0r + x0i);
x0r = x3i + x1r;
x0i = x3r - x1i;
a[] = wk1r * (x0i - x0r);
a[] = wk1r * (x0i + x0r);
k1 = ;
for (j = ; j < n; j += ) {
k1 += ;
k2 = * k1;
wk2r = rdft_w[k1 + ];
wk2i = rdft_w[k1 + ];
wk1r = rdft_w[k2 + ];
wk1i = rdft_w[k2 + ];
wk3r = rdft_wk3ri_first[k1 + ];
wk3i = rdft_wk3ri_first[k1 + ];
x0r = a[j + ] + a[j + ];
x0i = a[j + ] + a[j + ];
x1r = a[j + ] - a[j + ];
x1i = a[j + ] - a[j + ];
x2r = a[j + ] + a[j + ];
x2i = a[j + ] + a[j + ];
x3r = a[j + ] - a[j + ];
x3i = a[j + ] - a[j + ];
a[j + ] = x0r + x2r;
a[j + ] = x0i + x2i;
x0r -= x2r;
x0i -= x2i;
a[j + ] = wk2r * x0r - wk2i * x0i;
a[j + ] = wk2r * x0i + wk2i * x0r;
x0r = x1r - x3i;
x0i = x1i + x3r;
a[j + ] = wk1r * x0r - wk1i * x0i;
a[j + ] = wk1r * x0i + wk1i * x0r;
x0r = x1r + x3i;
x0i = x1i - x3r;
a[j + ] = wk3r * x0r - wk3i * x0i;
a[j + ] = wk3r * x0i + wk3i * x0r;
wk1r = rdft_w[k2 + ];
wk1i = rdft_w[k2 + ];
wk3r = rdft_wk3ri_second[k1 + ];
wk3i = rdft_wk3ri_second[k1 + ];
x0r = a[j + ] + a[j + ];
x0i = a[j + ] + a[j + ];
x1r = a[j + ] - a[j + ];
x1i = a[j + ] - a[j + ];
x2r = a[j + ] + a[j + ];
x2i = a[j + ] + a[j + ];
x3r = a[j + ] - a[j + ];
x3i = a[j + ] - a[j + ];
a[j + ] = x0r + x2r;
a[j + ] = x0i + x2i;
x0r -= x2r;
x0i -= x2i;
a[j + ] = -wk2i * x0r - wk2r * x0i;
a[j + ] = -wk2i * x0i + wk2r * x0r;
x0r = x1r - x3i;
x0i = x1i + x3r;
a[j + ] = wk1r * x0r - wk1i * x0i;
a[j + ] = wk1r * x0i + wk1i * x0r;
x0r = x1r + x3i;
x0i = x1i - x3r;
a[j + ] = wk3r * x0r - wk3i * x0i;
a[j + ] = wk3r * x0i + wk3i * x0r;
}
} static void cftmdl_128_C(float* a) {
const int l = ;
const int n = ;
const int m = ;
int j0, j1, j2, j3, k, k1, k2, m2;
float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; for (j0 = ; j0 < l; j0 += ) {
j1 = j0 + ;
j2 = j0 + ;
j3 = j0 + ;
x0r = a[j0 + ] + a[j1 + ];
x0i = a[j0 + ] + a[j1 + ];
x1r = a[j0 + ] - a[j1 + ];
x1i = a[j0 + ] - a[j1 + ];
x2r = a[j2 + ] + a[j3 + ];
x2i = a[j2 + ] + a[j3 + ];
x3r = a[j2 + ] - a[j3 + ];
x3i = a[j2 + ] - a[j3 + ];
a[j0 + ] = x0r + x2r;
a[j0 + ] = x0i + x2i;
a[j2 + ] = x0r - x2r;
a[j2 + ] = x0i - x2i;
a[j1 + ] = x1r - x3i;
a[j1 + ] = x1i + x3r;
a[j3 + ] = x1r + x3i;
a[j3 + ] = x1i - x3r;
}
wk1r = rdft_w[];
for (j0 = m; j0 < l + m; j0 += ) {
j1 = j0 + ;
j2 = j0 + ;
j3 = j0 + ;
x0r = a[j0 + ] + a[j1 + ];
x0i = a[j0 + ] + a[j1 + ];
x1r = a[j0 + ] - a[j1 + ];
x1i = a[j0 + ] - a[j1 + ];
x2r = a[j2 + ] + a[j3 + ];
x2i = a[j2 + ] + a[j3 + ];
x3r = a[j2 + ] - a[j3 + ];
x3i = a[j2 + ] - a[j3 + ];
a[j0 + ] = x0r + x2r;
a[j0 + ] = x0i + x2i;
a[j2 + ] = x2i - x0i;
a[j2 + ] = x0r - x2r;
x0r = x1r - x3i;
x0i = x1i + x3r;
a[j1 + ] = wk1r * (x0r - x0i);
a[j1 + ] = wk1r * (x0r + x0i);
x0r = x3i + x1r;
x0i = x3r - x1i;
a[j3 + ] = wk1r * (x0i - x0r);
a[j3 + ] = wk1r * (x0i + x0r);
}
k1 = ;
m2 = * m;
for (k = m2; k < n; k += m2) {
k1 += ;
k2 = * k1;
wk2r = rdft_w[k1 + ];
wk2i = rdft_w[k1 + ];
wk1r = rdft_w[k2 + ];
wk1i = rdft_w[k2 + ];
wk3r = rdft_wk3ri_first[k1 + ];
wk3i = rdft_wk3ri_first[k1 + ];
for (j0 = k; j0 < l + k; j0 += ) {
j1 = j0 + ;
j2 = j0 + ;
j3 = j0 + ;
x0r = a[j0 + ] + a[j1 + ];
x0i = a[j0 + ] + a[j1 + ];
x1r = a[j0 + ] - a[j1 + ];
x1i = a[j0 + ] - a[j1 + ];
x2r = a[j2 + ] + a[j3 + ];
x2i = a[j2 + ] + a[j3 + ];
x3r = a[j2 + ] - a[j3 + ];
x3i = a[j2 + ] - a[j3 + ];
a[j0 + ] = x0r + x2r;
a[j0 + ] = x0i + x2i;
x0r -= x2r;
x0i -= x2i;
a[j2 + ] = wk2r * x0r - wk2i * x0i;
a[j2 + ] = wk2r * x0i + wk2i * x0r;
x0r = x1r - x3i;
x0i = x1i + x3r;
a[j1 + ] = wk1r * x0r - wk1i * x0i;
a[j1 + ] = wk1r * x0i + wk1i * x0r;
x0r = x1r + x3i;
x0i = x1i - x3r;
a[j3 + ] = wk3r * x0r - wk3i * x0i;
a[j3 + ] = wk3r * x0i + wk3i * x0r;
}
wk1r = rdft_w[k2 + ];
wk1i = rdft_w[k2 + ];
wk3r = rdft_wk3ri_second[k1 + ];
wk3i = rdft_wk3ri_second[k1 + ];
for (j0 = k + m; j0 < l + (k + m); j0 += ) {
j1 = j0 + ;
j2 = j0 + ;
j3 = j0 + ;
x0r = a[j0 + ] + a[j1 + ];
x0i = a[j0 + ] + a[j1 + ];
x1r = a[j0 + ] - a[j1 + ];
x1i = a[j0 + ] - a[j1 + ];
x2r = a[j2 + ] + a[j3 + ];
x2i = a[j2 + ] + a[j3 + ];
x3r = a[j2 + ] - a[j3 + ];
x3i = a[j2 + ] - a[j3 + ];
a[j0 + ] = x0r + x2r;
a[j0 + ] = x0i + x2i;
x0r -= x2r;
x0i -= x2i;
a[j2 + ] = -wk2i * x0r - wk2r * x0i;
a[j2 + ] = -wk2i * x0i + wk2r * x0r;
x0r = x1r - x3i;
x0i = x1i + x3r;
a[j1 + ] = wk1r * x0r - wk1i * x0i;
a[j1 + ] = wk1r * x0i + wk1i * x0r;
x0r = x1r + x3i;
x0i = x1i - x3r;
a[j3 + ] = wk3r * x0r - wk3i * x0i;
a[j3 + ] = wk3r * x0i + wk3i * x0r;
}
}
} static void cftfsub_128(float* a) {
int j, j1, j2, j3, l;
float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; cft1st_128(a);
cftmdl_128(a);
l = ;
for (j = ; j < l; j += ) {
j1 = j + l;
j2 = j1 + l;
j3 = j2 + l;
x0r = a[j] + a[j1];
x0i = a[j + ] + a[j1 + ];
x1r = a[j] - a[j1];
x1i = a[j + ] - a[j1 + ];
x2r = a[j2] + a[j3];
x2i = a[j2 + ] + a[j3 + ];
x3r = a[j2] - a[j3];
x3i = a[j2 + ] - a[j3 + ];
a[j] = x0r + x2r;
a[j + ] = x0i + x2i;
a[j2] = x0r - x2r;
a[j2 + ] = x0i - x2i;
a[j1] = x1r - x3i;
a[j1 + ] = x1i + x3r;
a[j3] = x1r + x3i;
a[j3 + ] = x1i - x3r;
}
} static void cftbsub_128(float* a) {
int j, j1, j2, j3, l;
float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; cft1st_128(a);
cftmdl_128(a);
l = ; for (j = ; j < l; j += ) {
j1 = j + l;
j2 = j1 + l;
j3 = j2 + l;
x0r = a[j] + a[j1];
x0i = -a[j + ] - a[j1 + ];
x1r = a[j] - a[j1];
x1i = -a[j + ] + a[j1 + ];
x2r = a[j2] + a[j3];
x2i = a[j2 + ] + a[j3 + ];
x3r = a[j2] - a[j3];
x3i = a[j2 + ] - a[j3 + ];
a[j] = x0r + x2r;
a[j + ] = x0i - x2i;
a[j2] = x0r - x2r;
a[j2 + ] = x0i + x2i;
a[j1] = x1r - x3i;
a[j1 + ] = x1i - x3r;
a[j3] = x1r + x3i;
a[j3 + ] = x1i + x3r;
}
} static void rftfsub_128_C(float* a) {
const float* c = rdft_w + ;
int j1, j2, k1, k2;
float wkr, wki, xr, xi, yr, yi; for (j1 = , j2 = ; j2 < ; j1 += , j2 += ) {
k2 = - j2;
k1 = - j1;
wkr = 0.5f - c[k1];
wki = c[j1];
xr = a[j2 + ] - a[k2 + ];
xi = a[j2 + ] + a[k2 + ];
yr = wkr * xr - wki * xi;
yi = wkr * xi + wki * xr;
a[j2 + ] -= yr;
a[j2 + ] -= yi;
a[k2 + ] += yr;
a[k2 + ] -= yi;
}
} static void rftbsub_128_C(float* a) {
const float* c = rdft_w + ;
int j1, j2, k1, k2;
float wkr, wki, xr, xi, yr, yi; a[] = -a[];
for (j1 = , j2 = ; j2 < ; j1 += , j2 += ) {
k2 = - j2;
k1 = - j1;
wkr = 0.5f - c[k1];
wki = c[j1];
xr = a[j2 + ] - a[k2 + ];
xi = a[j2 + ] + a[k2 + ];
yr = wkr * xr + wki * xi;
yi = wkr * xi - wki * xr;
a[j2 + ] = a[j2 + ] - yr;
a[j2 + ] = yi - a[j2 + ];
a[k2 + ] = yr + a[k2 + ];
a[k2 + ] = yi - a[k2 + ];
}
a[] = -a[];
} void aec_rdft_forward_128(float* a) {
float xi;
bitrv2_128(a);
cftfsub_128(a);
rftfsub_128(a);
xi = a[] - a[];
a[] += a[];
a[] = xi;
} void aec_rdft_inverse_128(float* a) {
a[] = 0.5f * (a[] - a[]);
a[] -= a[];
rftbsub_128(a);
bitrv2_128(a);
cftbsub_128(a);
} // code path selection
rft_sub_128_t cft1st_128;
rft_sub_128_t cftmdl_128;
rft_sub_128_t rftfsub_128;
rft_sub_128_t rftbsub_128; void aec_rdft_init(void) {
cft1st_128 = cft1st_128_C;
cftmdl_128 = cftmdl_128_C;
rftfsub_128 = rftfsub_128_C;
rftbsub_128 = rftbsub_128_C;
#if defined(WEBRTC_ARCH_X86_FAMILY)
if (WebRtc_GetCPUInfo(kSSE2)) {
aec_rdft_init_sse2();
}
#endif
// init library constants.
makewt_32();
makect_32();
}
webRTC中回声消除(AEC)模块编译时aec_rdft.c文件报错:的更多相关文章
- Maven构建项目时index.jsp文件报错
错误为:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 原 ...
- Eclipse导入maven项目时,pom-xml文件报错处理方法
报错如下: Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins 解决方法: 出现该错误是因为jar ...
- webrtc 的回声抵消(aec、aecm)算法简介(转)
webrtc 的回声抵消(aec.aecm)算法简介 webrtc 的回声抵消(aec.aecm)算法主要包括以下几个重要模块:1.回声时延估计 2.NLMS(归一化最小均方自适应算法) ...
- 拓展 - Webrtc 的回声抵消(aec、aecm)算法简介
webrtc 的回声抵消(aec.aecm)算法简介 原文链接:丢失.不好意思 webrtc 的回声抵消(aec.aecm)算法主要包括以下几个重要模块:1.回声时延估计 2.NLMS( ...
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
C#编译器优化那点事 使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...
- Python模块学习之xlrd 读取Excel时传入formatting_info=True报错:NotImplementedError: formatting_info=True not yet implemented
问题:xlrd读取Excel时传入 formatting_info=True 报错 之前我们使用读取xls文件的时候都是使用的xlrd库,但是这个库只能操作 .xls格式,对于后来的 .xlsx的版本 ...
- python踩坑系列之导入包时下划红线及报错“No module named”问题
python踩坑系列之导入包时下划红线及报错“No module named”问题 使用pycharm编写Python时,自己写了一个包(commontool),在同级另一个路径下(fileshand ...
- 安装php时,make步骤报错make: *** [ext/gd/gd.lo] Error 1
安装PHP时,make步骤报错make: *** [ext/gd/gd.lo] Error 1 /usr/local/src/LAMP+memcahed+catci/php-5.4.0/ext/gd/ ...
- php中读取中文文件夹及文件报错
php读取时出现中文乱码 一般php输出中出现中文乱码我们可用 header ('content:text/html;charset="utf-8"'); php中读取中文文件夹及 ...
随机推荐
- PyTorch对ResNet网络的实现解析
PyTorch对ResNet网络的实现解析 1.首先导入需要使用的包 import torch.nn as nn import torch.utils.model_zoo as model_zoo # ...
- 白面系列 redis
redis是Key-Value数据库,和Memcached类似.value可以是多种类型,如Strings, Lists, Hashes, Sets 及 Ordered Sets等. redis一个牛 ...
- sql简单练习语句
排序是每个软件工程师和开发人员都需要掌握的技能.不仅需要通过编程面试,还要对程序本身有一个全面的理解.不同的排序算法很好地展示了算法设计上如何强烈的影响程序的复杂度.运行速度和效率. 排序有很多种实现 ...
- go语言 base64编码解码
package main import ( "encoding/base64" "fmt" ) func main() { str := "Man&q ...
- Hydra暴力破解工具
hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e nsr] [-o FILE] [-t TASKS] [-M FILE [- ...
- 通过django搭建一个简易的web页面(实现数据的查询、添加、修改、删除)
一.创建django项目 通过命令创建: django-admin startproject 项目名称 创建app应用 python3 manage.py startapp 应用名 #这里manage ...
- [MC] 我的世界 craftbukkit-1.12.2 卡爆
昨天晚上的时候,和朋友玩我的世界 结果我这边卡爆了,牛圈里面的牛都是一动一动的... 然后我登陆服务器,发现CPU爆炸了... 100%的使用率 mstsc都卡爆了 内存占用了800多MB (服务器是 ...
- 关于BaiduPSC-Go的一些bug的更正
首先说下操作步骤 下载是在GutHub,这个不赘述,网上很多资料 下载之后配置环境变量,在path的后面加上一个分号,然后加上你下载的目录,目录名最好为英文 然后通过命令行CMD工具,输入BaiduP ...
- HDU多校第三场 Hdu6606 Distribution of books 线段树优化DP
Hdu6606 Distribution of books 题意 把一段连续的数字分成k段,不能有空段且段和段之间不能有间隔,但是可以舍去一部分后缀数字,求\(min(max((\sum ai ))\ ...
- Hibernate:HIbernate配置详解-HelloWorld
hibernate介绍: Hibernate是一个开源的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 它不仅提供了从java类到数 ...