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中读取中文文件夹及 ...
随机推荐
- Java基本语法--运算符
运算符是一种特殊的符号,用以表示数据的运算.赋值和比较等.本篇博客详细介绍Java基本语法中的运算符,主要包括算术运算符.赋值运算符.比较运算符(关系运算符).逻辑运算符.位运算符.三元运算符. Ja ...
- layui树形结构更改
/* * 将json字符串更改为layui.tree所用的数据结构类型,输出仍然为json字符串 * tanghao 7.29 */ function dataToTreeData(oData_str ...
- 使用Vue创建一个新项目
1.环境 保证已经安装好了node\npm\vue等工具,将路径设置为想要建立新项目的文件夹路径 2.关于npm与cnpm npm包管理器,是集成在node中的,node环境安装完成,npm包管理器也 ...
- Oracle客户端安装及下载地址
一.下载 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461 ...
- 【HTML】三种方法使HTML单页面输入密码才能访问
方法一 <script type="text/javascript"> function password() { var testV = 1; var pass1 = ...
- K3违反内码唯一键约束
K3有时候需要向数据库中插入数据,但是插入的时候遇到主键冲突的错误,可以用如下方法解决. 比如新增联系人时,完整错误如下:? ? 违反了 PRIMARY KEY 约束 'PK_CRM_Contact' ...
- Java必须知道的知识点
junit用法,before,beforeClass,after, afterClass的执行顺序 分布式锁 nginx的请求转发算法,如何配置根据权重转发 用hashmap实现redis有什么问题( ...
- python itertool 浅谈迭代工具
1.概述 Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先,我们看看itertools提供的几个“无限”迭代器: import itertools natuals ...
- 当你工作与生活迷茫时可以来看看 shuke
青春是用来奋斗的 很多人在还没工作的时候,总感觉自己有能力会混的不错.毕业几年后,发现社会跟学校完全是两个世界.不经常思考的人,惰性总会让人得过且过混日子,不思考未来的路怎么走,就等于你安于现状,接受 ...
- JS高级---函数中的this的指向,函数的不同调用方式
函数中的this的指向 普通函数中的this是谁?-----window 对象.方法中的this是谁?----当前的实例对象 定时器方法中的this是谁?----window 构造函数中的this是谁 ...