|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 6 q+ N, r' v8 j0 E
, o3 X$ Q8 Q3 A! V% s ]
各位大神:
1 i; }. w9 ?; o" X- v4 B 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
: o* m2 Z8 u0 U; Z7 w! k T) ` 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
. G9 Q# J- Y2 [2 J9 s( ]9 @( B/ ^7 V% V& r' P* z, T
+ @: @% {4 k: _+ N# \
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
* ] A4 m' p9 p: D3 K
; W3 m0 u9 Q/ R9 B+ T% q并没有其他线程0 r8 ]- O& K3 a P7 H
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
/ C+ N' I* `. H也说不定是和堆栈有关系。。。。。。
- g e( U9 s. K4 t) j% g: u请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
8 V/ {5 x9 D% w0 H2 B. {0 P
: L6 ]0 f4 r8 a, G4 f' m- F+ M/ U$ l+ W% d% |. s/ m+ W& I
5 s4 y& T* x) [; Y我也很绝望啊,希望大神能帮帮忙,感激不尽,!
: K/ g- @% q s1 u3 Q, }: k G8 g
2 z% H$ Z* _, [; J) Q1 D" K! z; T; Z5 N7 X& t8 `: l2 Y* Y
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
1 W& [ j& Q/ ^) ?. X static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。1 G+ C/ W% r$ ^2 d P6 e
7 ]* N$ t" u g; l
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
5 B) G3 n& }) V! H const double data1000[1000]) {
. j/ r n- i* Y$ N# `
! A8 ~/ M' U# m, j$ h; F int myfuck;+ T4 X# J" m" o" a
double yiDuanShuJu_mean;2 y) o) ]) Q- r- w2 W0 ?
double yiDuanShuJu_LowMean[1000];: u# D X& g; Y1 d+ u4 l# r
int ixstart;/ _& V# B* s4 e. ^. u
double dv0[1000];8 |. b' z7 z* P
comm_AGC pAGC;
0 e7 }# [: b/ `7 I; S9 W comm_CarrierSynchronizer pFineFreqCompensator;
6 B' y0 y( \, F dspcodegen_FIRDecimator pRxFilter;
' i/ g4 \: C; p. G6 S- G1 H comm_SymbolSynchronizer pTimingRec;- s3 R+ v* r5 _2 }2 L8 [ U
comm_PreambleDetector pPrbDet;
% N _$ a; g$ o; F. b" d FrameSynchronizer pFrameSync;) d/ i; A$ C" B5 l) S3 J% @0 V; F
QPSKDataDecoder pDataDecod;
. Q0 p% r. T0 D$ d; }5 l static double usable_left_filtfilt[81000];
: }8 f2 |- e0 S r0 j w static double youXiaoShuJu_QuZhiLiu[81000];
" K3 G5 ~7 f- f double mtmp;
$ [2 @8 Y5 X% B int ix;5 g/ G8 Q' @; _% r d& t
boolean_T exitg2;
& i" y0 W9 K- d" r boolean_T exitg1;
! |' ~. ~; {+ f$ I# Y double YiZhenShuJu[800];. u S( D. x: B5 J( Z
double dv1[800];
1 H7 B. W, P3 M+ I* B* V/ J! j( |% y3 R* o' P3 u1 @; h
4 J5 o( U5 D) B* p% ^7 f' j4 Z4 Z2 R6 ?
double b_YiZhenShuJu[800];
% c4 d e0 z0 u B. X' Q0 G double I_filtfilt[800];
* o) M/ ~% w p& w; w double Q_filtfilt[800];: T% I% _7 W( q6 n% G
creal_T b_I_filtfilt[800];$ W$ C, O1 a" o0 @) F5 a: Q
creal_T b[800];
# Z6 z& ^! i3 O `9 \2 g- \$ R( S' T creal_T RCRxSignal[50];0 w) _; f0 e0 K- E
creal_T fineCompSignal[50];, t" M" j2 ?1 `. {( k& g/ ~
double phError[50];/ L; P: R' o. v W9 @
creal_T timingRecSignal_data[28];
# K; y: k+ L. e) R int timingRecSignal_size[1];) w% |. a2 @" N
double prbIdx_data[28];- p' F# {5 z5 O7 R7 ~ I( H
int prbIdx_size[1];
: L8 Y2 F, v2 d) R( W* X double dtMt_data[28];
' ~, f( m1 G( V3 ] int dtMt_size[1];
4 v7 ]" ]' E' f7 L creal_T symFrame[25];
7 D5 Q" F3 b8 C# b boolean_T isFrameValid;, H& S8 Y+ @4 g6 V4 _: {7 ^7 {
double unusedU0[3];& a, p, Q0 a$ S2 z1 b! O& K
5 F. w0 Y9 y, x* B' r% f y5 A3 N
//调试过程中的变量
6 z7 s0 D0 W$ q: ] int enough_data;, y4 M) m( X# x5 x
$ U& Q# A: q `! Z* I int enoughDataFlag;$ w! j, e; F# [
int yiDuanShuJu_mean_int;& m" {5 d- X, E H o
int int_sum_dv0;- i1 C/ ^* ^& _
int oo;" ^1 d; V. a6 [3 E/ {
int ii;
* n# p r7 s4 ~/ w myfuck=10;! U( `5 G" ~2 n' h: ~
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */- m1 U. g' D! ^, Z$ a
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
0 R1 C3 d/ [2 g/ I
- i& `+ B* G" y8 g* o0 l { yiDuanShuJu_mean = mean(data1000);
( M7 V# e- a* D" x. o1 S" c
% d- m9 E/ D: A: h, `$ t5 J2 V yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;+ J+ @- V, g% b$ C! S1 Z+ [
UARTPutc('A');
! K9 G: ?: l1 S9 [/ S6 N5 @+ Y UARTPutNum(yiDuanShuJu_mean_int);
5 ^: n3 P: ?6 y" W% m% ^( m UARTPutc('\r');
# O0 D! l8 k' U q UARTPutc('\n'); T V/ y: k6 _
) a9 I2 n+ i2 C4 k y& e1 s
for (ixstart = 0; ixstart < 1000; ixstart++) {( s' y" c5 `, g+ z4 b5 J, {3 t
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
, c. K n$ j& S }
- b- @# m3 u: G8 ]- l9 o
6 m& p. T! a/ d) ~" _% n power(yiDuanShuJu_LowMean, dv0);; }# c7 w" E3 o+ b$ u8 O6 v1 @
) Y- H/ _% E1 P! I
int_sum_dv0 = (int) sum(dv0);# l& ^4 u% _9 L5 a* P+ d0 I, f$ I! G
% w4 i0 M: `$ j2 I8 M- B' d7 G+ D UARTPutc('B');
+ q$ g% O7 X% w4 e1 h UARTPutNum(int_sum_dv0);
( P% \2 }5 k4 y* g5 a$ r1 } UARTPutc('\r');
! z8 r7 _2 f$ I2 q$ {$ ~ UARTPutc('\n');
+ h) b. R8 K) ?. V4 Y( C
% C$ X8 \' |' t6 Q// int compareFlag = int_sum_dv0 > 1.0E+8;6 k6 ?+ u: D- }! \8 |8 W
" c* A. P6 o8 l i3 f if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
2 b9 D, p, M% h7 J' N* a UARTPutc('C');# M1 i. R: j0 }2 k' d2 J" f a
/* 比较信号能量 */# o: ?" k/ x3 ^7 l
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */, k( w+ u0 r2 G; _, q1 N$ h5 C
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
: z" d9 N* A" E/ w+ T+ v9 J. t// for (ixstart = 0; ixstart < 1000; ixstart++) {4 v0 @) b; e* f& h; j
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =1 c6 F3 i8 B' U l, k
// yiDuanShuJu_LowMean[ixstart];7 v2 G) b4 |/ C4 L& T6 }4 c. o
// }
4 Y. M, Q* o8 M; b* }1 L6 s7 ]//
# G4 [3 c1 K Y% q5 R// youxiao_k++;; Z# w* s, L8 N* j4 y, l. `
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
/ l+ T6 V+ _+ l5 v$ U3 C' M$ m1 n// /* 感觉要取21个数,即0-20, */7 a" n- {( P& M4 z2 W! Z2 V
// enough_data = 10;//有效是10,无效是0
, ~& M9 r, e J% j( K// }2 E/ V0 x5 p/ k4 B1 B
}
+ D2 i6 Y" x, N& n( L2 S; T, A
+ B9 l: N. A' h) k! m! Y0 o5 K$ O# |
enoughDataFlag = 100;
, b- w5 }1 D: v; ~ enoughDataFlag = 1000;
2 `) ^: V8 ]" K7 D: X; @ enoughDataFlag = 0x02; T# P! }8 P+ F8 M" h" C
enoughDataFlag = 200;
* e6 {3 r0 k0 K$ h
8 b+ [/ H K) ]( Z5 u int myfuvk1;
2 B$ v4 I0 A) |% l$ I0 U7 | myfuvk1 =11;
# }3 h; |! i/ q/ y8 k: u9 p: x- F, E
8 q7 y! |4 a6 C+ d: r9 a! {6 O9 u
enough_data = 0;
' W( R U# X4 ?0 N" A% ^3 g6 g- C: g* s8 p# G( r0 T" R" ~! @* B
// if(enough_data>50){
, T/ Q; Y" o6 V0 h* L: E, @ {// enoughDataFlag=0x01;! Z2 X% n1 ^( }4 R: _4 c" g! C4 L
// }else if(enough_data<50){9 p' o. J: s0 \# ~
// enoughDataFlag=0x00;//0x00还是不行
9 j! T9 Z8 @2 ?) G, h5 D8 r// }
) h% `/ z2 B" n- f2 q' ]; `8 ]3 \% q) b
1 Z7 `1 r+ q0 q( Y5 A7 e+ H4 s
oo=10;
! x" s( o6 d# v* ? oo = oo < 5;
, q8 |& [/ B C1 j) l+ ~ if(oo){: h9 y# V- H. [" K9 q! X/ C- X
ii=0;# h- C( Y* q$ M& {7 p
}
+ i# I0 `/ k) p. U4 W if(oo < 5){# `: _3 m- Q& ?$ B
ii=0;
- T3 y" e- B: R6 J( ^ p- A }0 J. I H) J- l+ b/ `( j
if(oo > 5){; A/ X* N, t. _
ii=0;
5 J2 D" O# k4 r7 E% k E, r }$ I% `* S3 z6 L0 H
; t+ d: ]+ l2 [
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */8 @: F5 E3 Z/ S( {
/* 如果数据足够才执行主程序 */' U+ a# N! Q! ]5 g" v- u# r
oo = oo < 5;
6 {. @5 P0 l; Z, ^2 F4 V: \5 } enoughDataFlag = enoughDataFlag < 5;1 Z I% E6 {6 O Y- l4 a
if (enoughDataFlag < 5) {0 l" t6 o( L1 t) c5 T# a
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
9 ~8 v2 C' T4 P" u' O: N) ?' s1 o0 J AGC_AGC(&pAGC);% P# _6 S/ A% v0 W# E' P
/ Y5 X# ?1 P7 j; n$ ~& K
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);7 @# Q; T+ m* {& X' x6 _
FIRDecimator_FIRDecimator(&pRxFilter);
# H& w: h K+ j& r' g# Y* n$ {$ c$ Z
/* Downsampling */
) z$ v" {( D0 @6 P- ]* |5 g" d c_SymbolSynchronizer_SymbolSync(&pTimingRec);
- L% C; T# G7 n- F: a% H. o( P; g; |+ Q+ h2 T, [
c_PreambleDetector_PreambleDete(&pPrbDet);4 k1 T0 M) Y) M2 r6 Y& x
5 R. `# m5 h. ~) o* @* p% B4 [
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */; y& g5 z( g. y; N8 {. C
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */1 W# v, h! ]' T- U' M) u- e
/* %帧数量=100 *// Z1 w6 @' K7 b& D, P8 p% o
pFrameSync.isInitialized = 0;1 l! \. `( Z# q, e! E3 i
3 e8 O2 i9 d0 }' x /* [EOF] */5 R1 z3 v5 w H7 `+ N
/* 前导码长度是13 */
. O" @/ i: }) J2 Q6 e /* %qpsk */
6 `( f0 m0 U5 ~3 T pDataDecod.isInitialized = 0;
5 L7 c0 s' b' ]" F/ A6 t9 n3 d. t4 F; _1 D5 T
/* end */
+ u6 I- M/ e2 `$ P. B /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
1 F0 D x) i. H" R /* Convert 3-dB frequency */
- t$ c( f7 [( W- ^, [3 L" ? /* Convert 3-dB frequency */
B$ G; G8 S( d( G: `. L filtfilt(save_buffer, usable_left_filtfilt);# F' P' n D) W ^8 k$ W1 b9 Y1 n2 Z
for (ixstart = 0; ixstart < 81000; ixstart++) {
7 V- {7 M w# m8 ~) E usable_left_filtfilt[ixstart] *= 2.0;
( B' M' |3 n1 C$ Y& m* k- ` }4 O- g( J- a. |! n2 m
1 O7 P1 X- Z% F0 K3 |, f; R. w, t
/* 注意乘2,处理幅度 */
3 x" t, G$ \( x0 | /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
& W" G" O( f2 v3 G0 ^% x /* %% 行列转换 */* Y; s. ]% L& Z B1 \
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
, ~5 q3 i1 K3 ]0 M3 E for (ixstart = 0; ixstart < 81000; ixstart++) {
! M' a- M' g1 G$ x5 E/ E youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
. Q5 O, d8 }. c6 z0 _ - yiDuanShuJu_mean;
x8 I7 u7 u7 [ X" J }5 p( \ g6 h' C$ `2 f @1 K
( U4 Y' n* V2 Z4 Y, C* k /* %% 应该对数据归一化,但是这一步放在哪比较好 */& R( Z& o) }3 \' D8 a" C6 q, Q
ixstart = 1;) a1 B5 C+ g' C
mtmp = youXiaoShuJu_QuZhiLiu[0];$ p1 e# Y% q5 B' Q
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {- ?6 ]% y( g% _* q \
ix = 2;
, j' ~' ?( o! j% d9 N7 S exitg2 = false;& g8 }" C7 K6 t0 E9 O- }
while ((!exitg2) && (ix < 81001)) {
8 r/ `% Z- o3 y' R) m0 f5 k ixstart = ix;
( d& |3 ] u; T& o if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
n' u7 P3 x; U, u mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
# q$ w) M3 ?$ `+ S6 W5 z exitg2 = true;( J( ]0 s3 C' e9 x x. _6 V
} else {$ P" E2 L. l. ~7 d9 b
ix++;$ E4 i2 q' {7 L# b- @: N! X# p% J
}
* T/ a& [* K+ z7 H o }1 K! k% c' M6 O9 _8 C
}% P2 E% u! P- s. { Z
2 e9 ^* `' G' ^- ]# w5 V$ @: w if (ixstart < 81000) {' M3 P% N: A" O. z
while (ixstart + 1 < 81001) {
; A& ^; @. T0 |1 O. k4 ^ if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
( H8 F: f# l+ r& W4 w3 C mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
9 {: \; D: E$ P6 D$ p; ^, i) _ }
' B/ u# K G5 T+ P# ^4 N% a" f0 g0 U& _8 F+ H, p* u8 G
ixstart++;0 H8 C: E4 R% k
}4 X' W! a/ t9 }2 t; f6 o" X
}, v) r. L* Q) a$ c6 z; p% B/ I
8 M$ n2 i# |& E) y
ixstart = 1;
- a7 k: Z# S4 c4 J yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];# V7 l& Q" @( A( t0 u" ^
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
9 S7 }% f/ p0 A' d/ a# H7 { G: G' P ix = 2;* I! c/ h; f; n: E$ o P8 B
exitg1 = false;+ j& G9 Y1 P9 L5 K4 \% E6 U
while ((!exitg1) && (ix < 81001)) {8 K9 b" I' ~% ?7 C$ Z
ixstart = ix;
' D! Q8 k5 H2 l. l if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
0 m0 Z5 }) i$ @ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
) `% r8 Z% q: `- w' m& v; f exitg1 = true;1 Q' p0 l# s2 \# _" G4 n4 b
} else {7 V5 F# T7 \/ h- j$ k* X
ix++;8 k. ^- v' f0 d8 u6 [2 r
}
* ~# R& \7 B0 g# f% G' ] }
; I. ~+ m6 W5 U5 X0 v+ Y; L }
4 B/ o; h7 l. n+ S2 T; M0 v$ i* Q9 W& y' J0 m H
if (ixstart < 81000) {
; Y" X _6 }) n while (ixstart + 1 < 81001) { \; a7 r5 I3 v- y& r+ I c
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {7 K! `$ r6 G9 w4 [0 D4 A
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];( k2 L, k7 u; t4 T4 _
}- s s6 R7 o" ^" {0 r
) M' c7 f! l5 a& b
ixstart++;+ m: G- E3 V0 R b) J L+ v1 b
}
& d% w$ o3 ^6 _4 `7 ^ }6 C* i" ~- X; F# E. c3 ?$ n
3 Y; N9 d! m2 F6 V/ p1 O
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
; t7 [& ?. E3 U if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {$ H6 H' Z& {, l: m0 { W5 B; w/ A
yiDuanShuJu_mean = mtmp;% Z1 J& ~# D# H2 m$ p l/ b- I' U+ Y
} d; B' O- V: |% z
$ F- H4 M5 J) P# U
/* 找出极值 */
$ ?) I% O) G( w for (ixstart = 0; ixstart < 81000; ixstart++) {
3 S8 O3 J. O" f R/ h, _ youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;8 X8 B! W! M' |9 t! y( V, }0 ^
}
) [: k' k( W! c- Z7 {' {) t
x: d. d$ l: v1 s& m, ] --------------帖子字数限制------------------3 t& | i1 `& `6 E8 E' M0 A
}
/ j9 t/ F1 J& n. V* l5 x# a; i4 M9 c4 a+ I+ i4 r
# }( F# c( ~9 ]" P$ `9 ~. c
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|