|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 5 M9 b5 ~9 @) }" c- j$ } K
+ x( u9 I' I8 a9 c& l
各位大神:
$ ^7 Y, O5 O1 }! M; m 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~): ~) ~! x, ^# L) @( S
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:1 _, T7 p8 q4 Y$ M- p6 L/ o
& q' B9 L/ \( v! c, d F7 K' _
1 D" P4 u; N, S2 _这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。; P9 X* [5 C7 G8 K4 S
% o( k C, H: _ B: @- S
并没有其他线程
, i; Q# N# |* m- R# x$ g反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。5 a% D' g1 m/ X) K* D7 e
也说不定是和堆栈有关系。。。。。。3 `$ b$ v; v. A0 M
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
9 N. ~' |- n: P: S5 W- ]+ K$ A0 Q: L7 q9 `9 d7 i _4 Z3 @
1 Q, t/ N6 H5 ]6 s( D
9 B4 U: u7 s4 X2 ?
我也很绝望啊,希望大神能帮帮忙,感激不尽,!) e) K; n- a) r: N- x* V
$ |6 T ]! i; E4 ^1 a e4 p! \. t
/ M( h' b8 o; \附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];" n2 w; w4 F! q3 H/ Q2 f5 Q7 y
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。 f/ d, b/ G, c: T
4 q4 N5 F* u3 T' T* Vboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
+ k( @) o0 c* ~7 P8 j! E const double data1000[1000]) {
, E" E' S( U" |5 u1 U& \1 D/ {) d* a% G, |
int myfuck;
3 |3 d ]( `/ o U. ]" t- S* l double yiDuanShuJu_mean;4 m. M# h" [; `. \) ^6 V$ [' T
double yiDuanShuJu_LowMean[1000];7 i( l3 s3 H% m+ ]" M1 z1 ?
int ixstart;4 X7 \' N( z4 X) w. L( ?* f3 a* q: E
double dv0[1000];
2 S) ?: k, ~( b comm_AGC pAGC;. V% _4 ^, \/ E! \! G. z
comm_CarrierSynchronizer pFineFreqCompensator;" D% L0 c- G+ C" m2 o) _
dspcodegen_FIRDecimator pRxFilter;* S7 c: z- ]2 \* o2 y6 {
comm_SymbolSynchronizer pTimingRec;$ @( P7 i. Z. }
comm_PreambleDetector pPrbDet;
% ]! W1 a9 n3 S5 X' U; } n FrameSynchronizer pFrameSync;9 f$ a1 ], M6 d$ k# ^
QPSKDataDecoder pDataDecod;2 s) Q# o) h; z) x
static double usable_left_filtfilt[81000];0 `/ l) |$ Y' n& a5 S
static double youXiaoShuJu_QuZhiLiu[81000];) f" X5 S9 W, d1 F8 o, _
double mtmp;
: o- f2 q+ E; k- v7 z2 \5 m int ix;+ F& k6 k, a! @- ^8 I
boolean_T exitg2;
1 x& |( m1 ~3 V0 {/ j d boolean_T exitg1;5 X. G& G" X4 h+ [4 u9 W
double YiZhenShuJu[800];
% I8 T+ P7 f% `* g5 f$ n1 l& K double dv1[800];
% I# U( Z0 m* ?7 Q4 W! T" R5 Q3 Z% F5 N8 f: H1 {
6 k1 c. _7 J: [0 q5 o
double b_YiZhenShuJu[800];
4 q3 A, ~7 U$ H! C- d$ } double I_filtfilt[800];8 C9 L, Q* Y, P
double Q_filtfilt[800];# }2 v! g1 I$ F1 h
creal_T b_I_filtfilt[800];+ Q' Z1 W0 P! y+ j& }
creal_T b[800];2 N- W- x- o1 ^' q9 b! l3 m4 e) F
creal_T RCRxSignal[50];7 i% z: U, \( R$ a% N% U: B) |
creal_T fineCompSignal[50];
* O U' K! J0 O; ?# ?! @) C4 [ double phError[50];
! g( p% c8 e8 e0 A& U# { creal_T timingRecSignal_data[28];2 s0 y: c, x4 u/ f
int timingRecSignal_size[1];
. Z: \# M+ @* L double prbIdx_data[28];
+ D2 H& `/ P$ k. l int prbIdx_size[1];
s" u5 b F7 N" \1 L double dtMt_data[28];
1 C/ N4 X6 _9 R% M. o0 ^ int dtMt_size[1];
- T) C8 V; a# u z creal_T symFrame[25];! D. a' ~7 K! x2 c l
boolean_T isFrameValid;0 _7 E; @% ^; {0 J) h2 a% q
double unusedU0[3];; O+ u# Z% a8 e- m
( x. G. ~. t( V6 [% W
//调试过程中的变量; s6 H( k. J0 A3 _5 ? I7 `- G* i
int enough_data;5 I' C0 _8 n" y
" w W. f3 X" [0 f0 u) y int enoughDataFlag;
$ o9 S: E- o k! r5 a( Q int yiDuanShuJu_mean_int;
: f% P& G: ]/ K3 U! e4 C; F) C) t% F int int_sum_dv0;8 v0 e. @; L$ |+ p3 l' O3 P
int oo;0 k4 X+ q( P& Q) d( Y5 b, n; P m
int ii;
8 P6 x/ o4 X$ }( a myfuck=10;
* M1 ^, c8 Z# c5 s6 e/ F: ]- ^ /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */% l. ]) A0 K/ [( O4 @9 W" X
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
- }$ z7 U1 ]$ _" x A4 g# S$ h8 _) Q
yiDuanShuJu_mean = mean(data1000);
' z# D* e1 R- m9 d( b1 I
; _1 C+ S( F4 m8 Q( v( X& q1 O; L yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
; V: m( Q- i4 k: f K6 q* l0 V UARTPutc('A');
( M6 X) X; D& U0 r2 ?% N UARTPutNum(yiDuanShuJu_mean_int);
, Q- d# Z. n- G. p& b4 M* L* l) d UARTPutc('\r');
$ I3 E* Z7 Y8 B. l, U. L UARTPutc('\n');
( S- |0 @4 N0 J1 b2 X
: ^2 J0 w( D8 u' @1 E1 H! f5 p for (ixstart = 0; ixstart < 1000; ixstart++) {# ]' j7 m7 y. I( @; y0 Y! l
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;2 J' G7 w2 A) `/ Z% k. w9 J
}
4 L, w$ O% i* ]. O' D) R: x e0 J3 \" ~5 x
power(yiDuanShuJu_LowMean, dv0);
z' `) R$ U% n( t( N7 A( N) B) R
int_sum_dv0 = (int) sum(dv0);
7 H% V4 c* k. @% a9 X n7 T7 V! T4 O& t7 r! i4 p
UARTPutc('B');
; ]& U% g# S% p/ Q& v* B UARTPutNum(int_sum_dv0);
6 V9 U6 a( U" f3 y# V UARTPutc('\r');
! h& c0 d% ~* X6 g! i UARTPutc('\n');; z, h% P, e+ B; `8 Q6 d
* o, e) C/ D; y) [/ B; Y1 H6 \9 q9 R
// int compareFlag = int_sum_dv0 > 1.0E+8;
( p; N8 Y* Y. i$ u. o
9 y3 I( W, ~3 l3 i if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
" \/ t6 b$ @4 h UARTPutc('C');
- h( S( O6 d- j* m% N /* 比较信号能量 */7 {. \% A$ c3 s8 E3 u7 H( o
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */$ z+ Y/ u. O- U! c- h* f& ?
// yiDuanShuJu_mean = 1000.0 * youxiao_k;( @( N5 N2 C& J! }/ x0 M" ]
// for (ixstart = 0; ixstart < 1000; ixstart++) {
7 X! g1 _) c% J// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =! _6 W. f. _3 W) V! H7 v6 @; x
// yiDuanShuJu_LowMean[ixstart];. l( K, g1 x4 U* E+ j, O/ B# T
// }
% ~ X' o1 ~! E7 p//
$ g7 `$ ^ k3 `& p. q; o// youxiao_k++;
( X1 n# S+ w( [! z" Y4 w2 n7 W// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==& Y/ S" Y5 o$ @; V6 n! C' {. }
// /* 感觉要取21个数,即0-20, */
7 Q6 ^2 ]4 a; ?; ]// enough_data = 10;//有效是10,无效是0
( E9 X0 U; I" u& F" C; y, I" ?// }2 O0 @9 ~8 c9 [' o5 z, P
}3 G& I/ z) ]; X& V
% a' C' C" ?" a
& n! P2 K' D& b2 w
enoughDataFlag = 100;
( q& T3 B: o+ ]! b6 b- o, M& | enoughDataFlag = 1000;3 b ^% t% B! T
enoughDataFlag = 0x02;
0 h, R4 K. n8 a3 a* G, w0 h W+ [ enoughDataFlag = 200;+ k( Q! q+ h6 i% P* E: n1 k5 {8 U$ h
* i& O n9 w7 p: P
int myfuvk1;3 i1 o5 t2 n! R$ B- u
myfuvk1 =11;0 R6 M- c* Y* g% r
$ {/ n+ N! P2 z9 {! O0 }
6 D$ D/ S" C( \. |/ a; u2 Z
enough_data = 0;+ P4 {. ~, O1 Q8 z/ C+ s2 b
; w' u! S6 m9 j" O. `: N4 x
// if(enough_data>50){
9 o6 u5 o3 E6 m1 Z# Z9 \- j- z0 T// enoughDataFlag=0x01;3 \, L2 ^2 X- Z8 ?# X# t: F
// }else if(enough_data<50){
; ` g& J$ T& {- U# m7 u) m// enoughDataFlag=0x00;//0x00还是不行: a3 H: X# ]4 e. M; x B
// }
2 U1 j% q& \2 T7 _6 g+ |
7 y" j3 Y6 i" p+ K+ c( {( e- K6 d6 g& p$ e, e
oo=10;' ]# j) |* }5 h
oo = oo < 5;
, j; {7 k; C; _" I( _. s) c2 N1 P if(oo){2 b/ w4 c* j9 I! ?/ T6 u2 V y
ii=0;
7 r- L1 f6 ^0 l+ l! G }' J3 ^: I7 T2 B- R. l8 G4 e+ g( B
if(oo < 5){
* ^+ p, P9 d' i) `" @ ii=0;( h6 d: x+ m% n5 O* [
}
2 ^2 u- _- n9 _ if(oo > 5){
4 ?1 P. g4 [6 X1 M+ l+ `" f ii=0;
# ` z/ e8 o& O7 |9 i }
0 A' u) F+ A& M* d9 v4 W, X/ r4 `, j# o# x
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
0 P: {. W% \$ x2 \& ]- X. A /* 如果数据足够才执行主程序 */
. r/ P: S4 T+ o+ k oo = oo < 5;# c" G2 ~+ i& ?" F( w9 E
enoughDataFlag = enoughDataFlag < 5;
' d! t/ I% j9 I; S if (enoughDataFlag < 5) {$ \8 n0 v9 E/ r! t r3 y
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
6 f4 Q/ O1 p8 T3 q AGC_AGC(&pAGC);; B$ o/ S8 ? Y- E# |7 N) n
$ M' ^5 k; L6 P6 C6 t' G$ v" t
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);+ t1 z: n* B: S/ F4 T7 L
FIRDecimator_FIRDecimator(&pRxFilter);
" S) G5 j, p3 t4 K! k) n* M/ e
# H! b' `6 C2 t2 C o! ? /* Downsampling */
* A7 Y A3 p- Z( H) H c_SymbolSynchronizer_SymbolSync(&pTimingRec);! N3 p! }4 Q/ _6 d0 J0 `/ g+ R
( d" C- J# i3 r I c_PreambleDetector_PreambleDete(&pPrbDet);
% {2 ^8 ^# N y3 Z$ {- y
- T( k5 @: `) ` /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
# X0 E, p' f5 A1 Y /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
5 o2 b( K& {0 {! w$ F /* %帧数量=100 */
% G: D2 r+ W! k# k, d pFrameSync.isInitialized = 0;
/ n8 U& p" |5 Y7 m8 I9 L7 X6 z1 \* W2 u# u* M7 {3 L2 O! p% p, l$ h
/* [EOF] */
% A7 a9 ~" g/ [' m, ?2 S' O /* 前导码长度是13 */6 W) o8 j1 \* M% X( @# M. g, W
/* %qpsk */
6 j! x" ~: w+ [0 r7 S pDataDecod.isInitialized = 0;* n; H- t% S- V0 e
/ Y' W% M3 T( g& a& |
/* end */1 |, l7 E' G. S& ?# R
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
6 Z* E' W) e* { /* Convert 3-dB frequency */
% q H3 j; m/ v! L: e5 J9 G /* Convert 3-dB frequency */% U: C' `8 j1 ^0 y
filtfilt(save_buffer, usable_left_filtfilt);
1 I0 W. L9 i5 k for (ixstart = 0; ixstart < 81000; ixstart++) {
5 f+ K) g# a- E h1 z usable_left_filtfilt[ixstart] *= 2.0;
" l1 D L+ r: x }, w7 G) k2 X) Q7 \# X
( c- M* q0 f2 N K
/* 注意乘2,处理幅度 */
& I1 K: J) M& J4 d' j; k, P /* %% 我发现带通之后其实就均值为0了,不用这一步了 */% M7 f- `" g& G/ y6 n+ ?5 m
/* %% 行列转换 */+ h8 W% N. n" X4 y2 ?! ^
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);, @9 Y) W/ A) p7 k1 C
for (ixstart = 0; ixstart < 81000; ixstart++) {% k+ `* H" x( J* C
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]! A3 E; T" h4 B, O L
- yiDuanShuJu_mean;. g& S. O: `2 s, N) X
}
- T7 G B R; h' o4 {. `
4 w* ?: x3 p! f+ { /* %% 应该对数据归一化,但是这一步放在哪比较好 */
, Y+ B. z+ P" S/ m, `1 k ixstart = 1;
) O8 L. V# C3 W: ~, b. b! k mtmp = youXiaoShuJu_QuZhiLiu[0];
: E+ a. v0 c- U2 Z! o! ] if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
9 u; }# M( i/ W, G3 R8 k. e ix = 2;0 T/ Z0 H1 E# y* M0 R
exitg2 = false;
, a, J1 b2 L1 Y' B8 \9 r3 g, T5 L while ((!exitg2) && (ix < 81001)) {) j0 U& p. _( N7 ?& ~- L9 e) o
ixstart = ix;
5 \0 u7 s9 G7 a# W6 m3 x( h( G if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
! y! E, x- P/ T6 w9 M- ^ mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];, h6 E, L. r0 x u
exitg2 = true; U( _9 f4 S0 m1 B/ V0 c1 P! m
} else {
& C$ N! t& z0 i$ i7 [& i ix++;8 g" P: G( ~, R/ N' D
}
/ I% I# C* t. F }
7 I/ C3 d4 ]2 u- u. o }
1 w+ X- O c5 Z7 O0 ]; s, T& I4 `3 r6 d. x% A6 ?
if (ixstart < 81000) {
8 m4 [( H2 a" ?# T while (ixstart + 1 < 81001) {9 ?, v6 d! o: x9 ]2 T. r O( e
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
b0 }- ^4 b! r! v9 Y' v- r S3 G mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
6 g7 V) q, N3 u6 Q" n }
1 E+ }5 s9 b- n1 [- A8 n! N
0 p4 } T- K7 \" _. x ixstart++;
; c; I( k: [1 U }
1 u/ ~( y, D2 i1 N }8 T9 ? k L. J% Q R. @
) ~0 ?8 c( p6 U3 A9 t a; e ]6 K
ixstart = 1;
. v& S- k1 q. D8 l/ [ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];8 R- g4 n2 e3 l4 o9 l8 |
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {' S3 `5 n- |. O: J
ix = 2;9 Z) M. l' u9 P( E b
exitg1 = false;; l& [% r" ?6 K& ^ Z/ M) @
while ((!exitg1) && (ix < 81001)) {& P* X- j" ~+ K& U, ~2 ], J
ixstart = ix;
9 H& |/ A F, b* T8 e if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {7 |- k+ C: y) d6 Q- X7 H% ^
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];* B/ E- {! y9 T: R; P
exitg1 = true;
3 h& U- `& K. q! T } else {
, _2 D2 I! ^& L" b( x ix++;6 \6 V) _9 L& K7 e- C
}
4 l0 Z1 N! p( Y# G }
, T" l2 R( ?4 Z. L! T }
0 A6 ]5 _* j& Q" V6 y5 P! q
" u0 C8 E5 S8 a" v1 M if (ixstart < 81000) {8 |# |" ?* H# V
while (ixstart + 1 < 81001) {4 c+ Z, R. O5 x! o2 `, l
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {" F2 m- _% B( D. F4 t* _# w
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
+ T) Y- D# A* s4 X- g! n } L2 t# a/ S5 V" w& J' C( }8 f
' X9 @+ _* w1 Q( G
ixstart++;
0 m f; O6 D; ?/ B2 u; K! _5 h1 D }# y& R$ a. \2 v' J- o
}$ }# l$ j0 E: j B
5 _% b, p2 N* B% U* m9 X3 c. h9 P. { yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
9 J9 e, F! l0 U* n" h+ `8 q if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {. {* \* v6 t O7 u9 U
yiDuanShuJu_mean = mtmp;5 z/ B3 o7 i4 o
}
( S- `, W- L) S- L8 R/ H
4 n2 O) D7 @+ ?0 F* i( q' C /* 找出极值 *// F5 U1 I, ]8 Z& w3 W& q
for (ixstart = 0; ixstart < 81000; ixstart++) {6 \9 o1 V- \: c4 l b9 h
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
$ U& y7 D( M# A, O3 { }+ s* r( H& Q- [' Z; w* S4 ^
5 Y( ]3 \& C! @' f --------------帖子字数限制------------------
7 C# z' Q& x* t}; ~7 ^/ X' l; o/ E* y u9 i
" b3 X* ?+ D Y% R# `0 [
+ _5 n) k7 H( \2 S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|