|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 1 e u% t! a* r b0 g( d
* {* f5 f& ]% T- X, s% f各位大神:9 B) |0 t$ ?7 V8 D. O/ b4 K
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
1 W1 p8 q/ I5 ~" i- S& } 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
% s% Q) B5 d) f' z$ A/ t" _+ U# I# Y X0 S* I ?( I
1 A. {2 i4 _# U* c这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。( x3 i9 i% Y, z
* {4 U: i$ k8 r9 |& r; \ z并没有其他线程
1 C* W2 _/ y: y: k反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
$ c3 U2 [* r4 ]: g) ^' v1 m也说不定是和堆栈有关系。。。。。。
6 O2 T3 w. N3 i( z# E请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
5 Q. j* q( Z1 h% s: o& Q5 Q1 Z4 a; |
8 B& h6 R( O. Z! @% x0 P& [
' ~# c2 z0 I4 b$ h& B我也很绝望啊,希望大神能帮帮忙,感激不尽,!
* B5 h8 W6 x: c! h2 J* H$ D. w7 `$ T& ~# } a: L- c/ E1 q; \0 t
! j/ _- [; k% h. [
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
- n- H3 ^1 h3 W7 ] z4 z& A static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
2 R; @7 P/ \1 K# u2 Y: x e- f' q( d0 L6 s/ t# a4 F) Y
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(- r: n3 y: ~% m
const double data1000[1000]) {4 x8 g* |% J* ?' w
5 E6 q0 p0 T7 b) b( r$ n+ u/ j) B int myfuck;
: ]% Q, h7 N. U: [+ T6 H. N double yiDuanShuJu_mean;
9 O3 U: m) m! B+ { o: k; { double yiDuanShuJu_LowMean[1000];
+ |* X: s, U( L8 M) ^: H8 r int ixstart;
$ H8 ^8 v9 Q5 t( m double dv0[1000];
: }# D9 W0 U, b1 j comm_AGC pAGC;
" s! G7 Y* a3 O1 X comm_CarrierSynchronizer pFineFreqCompensator;
& p+ g# C. [, q+ `* b dspcodegen_FIRDecimator pRxFilter;+ b% Z; t+ {- D) Z4 ^* x% @* @
comm_SymbolSynchronizer pTimingRec;% N: \* y8 H/ ], j6 F0 N" Y
comm_PreambleDetector pPrbDet;) g. s8 x- W1 ]4 b8 _% F7 ~. Z" u
FrameSynchronizer pFrameSync;
* V7 {2 M5 G, n2 a5 c QPSKDataDecoder pDataDecod;, g6 C) t; M1 ?5 n- ]% q ]) S
static double usable_left_filtfilt[81000];1 s8 |. m; i: h# [6 c
static double youXiaoShuJu_QuZhiLiu[81000];0 N# x2 O, ]2 ]' @4 s- z
double mtmp;
/ |, o8 h' l5 U' z% D1 s; ^7 K int ix;3 K: o& N0 C u; \9 ^: Y/ ^' ]- v
boolean_T exitg2;6 b3 Y" s6 x" |3 b
boolean_T exitg1; L, X" b# \6 n/ Z7 @& r
double YiZhenShuJu[800];5 @* n, v. [5 s2 O# g
double dv1[800];
0 }1 D, z! B7 Q
9 h# G1 u2 S9 D# z. x _# {
; l/ A$ _6 P' h7 { T" A double b_YiZhenShuJu[800];8 c2 O& v4 B. _7 i5 D0 D
double I_filtfilt[800];
7 _; ?2 t- i7 V( z4 b$ O) i double Q_filtfilt[800];
% `7 f1 Y5 N: ~ creal_T b_I_filtfilt[800];2 u4 g% t* G# q, W q
creal_T b[800];
. h" L! x) g, H2 n0 e# @9 Q creal_T RCRxSignal[50];
" G: x. g- o0 d2 G" s8 G* @ creal_T fineCompSignal[50];! Y0 i6 E# q2 o) ^: i# o; b- e
double phError[50];5 g K* X+ H9 d2 O
creal_T timingRecSignal_data[28];+ v/ p2 w J* b0 \9 `, A
int timingRecSignal_size[1];
6 Z; { _; f) R+ ] double prbIdx_data[28];& U0 X, y5 |$ P `6 i4 B
int prbIdx_size[1];
s% m4 L' [# f6 _8 m/ b0 @- L double dtMt_data[28];. P/ a: G' X6 Y, {
int dtMt_size[1];
8 o& ~# K. V, r5 S& o1 u) F creal_T symFrame[25];
3 ^0 ], V$ @; H5 X boolean_T isFrameValid;
3 A, H0 H6 L- L; Y% w# P7 X double unusedU0[3];; u& u4 d& v5 d
& q* h% V2 Y/ W2 G+ J# o8 R
//调试过程中的变量" A2 R' W5 r% B; S" t
int enough_data;
* g `& Q$ F( V# J" M2 m
! _' ^( n2 W$ v. g. K4 D0 V int enoughDataFlag;5 J. D5 N: @( m6 }/ N! b/ ~& R
int yiDuanShuJu_mean_int;
; W# d# S$ Y' V! w1 L0 `8 i int int_sum_dv0;: g: X1 `9 f* r2 F( g8 G" I9 B/ X
int oo;
( \. d b5 t0 c$ Z7 g int ii;8 n9 j! v) \5 D m
myfuck=10;
3 L; |8 H4 Q" f /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
/ K( |1 y* \8 d4 R) w& ^0 c /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */6 U) t0 A7 f& l. m! S9 v
' P9 o8 k! l( b/ T3 ^, ~0 L yiDuanShuJu_mean = mean(data1000);
. p9 n7 F# T6 B- e& Y
R3 a6 f( ]% O i9 ` yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
' f; t' E3 y3 K* B& y UARTPutc('A');0 v1 n! u; P: d m/ r! m |# u
UARTPutNum(yiDuanShuJu_mean_int);
6 q f8 F- H6 W4 y UARTPutc('\r');6 w. ^, ?4 e3 G6 _: G2 c
UARTPutc('\n');( Q0 w! E h/ B4 Y
' N: F B3 w5 V- P3 I
for (ixstart = 0; ixstart < 1000; ixstart++) {( F$ \+ X' A$ a# O; O% Z$ }9 G
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
7 V1 q8 N' w& W6 N; X }- c2 q2 t$ I0 s% B1 ~& T; l
( \! R. R" L* f- L, J* Z$ [
power(yiDuanShuJu_LowMean, dv0);. W, t+ ?# U% |4 E9 E+ n R
. r, N5 Q3 |$ D' f
int_sum_dv0 = (int) sum(dv0);* W h+ }4 }; d) Q( B8 U- _
5 G7 p7 M% p0 g: G5 T0 X0 M! F
UARTPutc('B');
2 [ m' y. p) w# a8 j/ ~% \$ k UARTPutNum(int_sum_dv0);
1 R5 Z2 u( s5 H' C1 n; \' X UARTPutc('\r');3 \1 G$ w3 W9 w) U
UARTPutc('\n');
* v/ s/ W5 X# I7 M" \
! `7 J* G5 D& I5 M' q1 D# u// int compareFlag = int_sum_dv0 > 1.0E+8;% a7 O4 a, y/ ]1 ~3 ]$ ^- t9 |
$ F* r" y7 a5 G- k
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?" y/ ^" w, {- N+ E# w8 g
UARTPutc('C');
1 k/ v3 M) C+ T3 V, M9 ~( e /* 比较信号能量 */
+ `. Y! ?3 S X. ^+ { /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */. U7 O/ o# B$ [; F" w
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
* A( ^$ g' x' m* S9 c1 y// for (ixstart = 0; ixstart < 1000; ixstart++) {
. L) V7 R8 g9 A4 l1 @$ {: t* d// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =' ~2 D; e2 Q# j7 I
// yiDuanShuJu_LowMean[ixstart];# \! f% p0 O( o! G( n
// }, [7 ^4 m8 N/ e$ r' P! S7 T
//- q; D; E& G3 x( J0 s6 d
// youxiao_k++;5 J6 Q# o* Y# y7 C4 M0 }
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
4 r+ V' `$ r- R$ }& N% v3 |, t) j// /* 感觉要取21个数,即0-20, */
/ X7 w# t: z" c// enough_data = 10;//有效是10,无效是0
$ A; `) w y4 h$ p// }; C m, `! }9 u" v: P7 p
}5 F, p, ?1 m& H# V; R1 i
. Q: c8 S& p. h& ^+ ^" W+ ]# M+ F2 P2 L) O6 e: T* i
enoughDataFlag = 100;
7 | e& t% m( F, C$ P enoughDataFlag = 1000;: T9 x) E8 J3 |+ V
enoughDataFlag = 0x02;0 p% i: y/ R' U) k- L/ G
enoughDataFlag = 200;8 R7 [% k& T: h2 q0 H0 w- E) J! y
, R( V3 |) U' E# T. [6 H! s* N int myfuvk1;/ `9 M! f9 {0 ?5 j8 z, O p
myfuvk1 =11;8 E3 }: h, S; I; ]( F
5 S! K; g% I' k7 h# c' r
1 w, i5 Q6 g. p! b* O enough_data = 0;
# \: d: ^) w* _6 E4 D& O6 Y9 K/ `) O* ^: J g, u3 v
// if(enough_data>50){8 q& u6 ~' a# l
// enoughDataFlag=0x01;
/ {% s' h. \9 m% A// }else if(enough_data<50){- w3 u6 S8 T" A6 r& `
// enoughDataFlag=0x00;//0x00还是不行
; p/ `1 R- S, C' |5 ^// }
8 M- [1 b( [) N
8 q: l: b) C: \% s& @# P# R
9 |% m1 ], y' y. T+ J& Z oo=10;
1 R0 f+ F* P* [1 ]# n oo = oo < 5;1 M& @2 G) Q- s; \4 E- C
if(oo){
- W: w s+ d, V4 r ii=0;* V# [9 h! }. v' ^
}
, R$ L& C" o9 e3 x! e if(oo < 5){5 f. p5 q# O# {* U0 u/ l
ii=0;. a# f9 D- `( r3 W8 j- }: q$ _8 s
}
$ j! h/ c# y; k' { if(oo > 5){+ j. }/ c* V, B1 n1 N4 Z
ii=0;
2 d4 d6 I1 ^+ { l8 p& S0 x }( A# r% O+ z6 q! q- s# i
/ n( A9 U9 Z3 m) b6 m
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */8 F3 [1 o8 b# N1 \2 s
/* 如果数据足够才执行主程序 */( {. }9 q, ?9 K- L# y$ N4 k
oo = oo < 5;- t' `% a, i) v7 V- {
enoughDataFlag = enoughDataFlag < 5;
# r9 f9 U+ i" i, k1 T q% S& K V+ \ if (enoughDataFlag < 5) {4 \* C; ?) z% T5 b7 g* i
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
9 x, @7 |, B: ]* X F AGC_AGC(&pAGC);
# v s; ?$ }0 X0 b1 \
1 [" v+ g, l+ R6 } c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);0 F$ f: q* }3 t6 G ~; G! @# m3 |
FIRDecimator_FIRDecimator(&pRxFilter);
* l7 C! H0 m# ^6 I; G4 ?
3 ~7 E- X/ U) E( n. E3 ^4 i /* Downsampling */; \" M! V: y+ l: V
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
5 I: Y5 q! M$ p+ T6 j a7 G
: u6 _; n0 e' V1 ] c_PreambleDetector_PreambleDete(&pPrbDet); Y$ h; Q- a8 P! w- A- O/ u
2 h9 p8 w4 U& ]1 H5 o /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */' `( z) M6 W9 N$ p; W' u, w0 I& \
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
: ~6 c7 P* P0 ^. d6 \! a /* %帧数量=100 */0 p% ]5 n7 F& m
pFrameSync.isInitialized = 0;. F( c; s3 n7 M0 G
5 Q: L5 G9 K- J1 m; V2 n: Q2 c
/* [EOF] */
0 S/ f. z) S8 d. s /* 前导码长度是13 */
b3 B2 B7 d! O+ }7 ?9 [9 ? /* %qpsk */
' F( j$ @3 `/ h: W& Z4 O pDataDecod.isInitialized = 0;$ \% P* c% j% |% p8 Z n- Y6 N
8 s, n/ P' P5 E( h& ^
/* end */8 |/ G, ^6 ^8 q, c4 c2 }/ {' g, |
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */ ~1 H) v' w6 F! Q
/* Convert 3-dB frequency */4 d5 E9 u4 o& e& `7 y5 y, V) H' l
/* Convert 3-dB frequency */
5 F% v5 a- _; F5 _$ H- P filtfilt(save_buffer, usable_left_filtfilt);
0 `0 b5 P# Z* ^: |! Y for (ixstart = 0; ixstart < 81000; ixstart++) {
6 u5 e: w( w G0 R U usable_left_filtfilt[ixstart] *= 2.0;+ v% X0 V! U. x5 L/ T$ l
}
- ~) g1 M% {0 U1 \' K* O* ] R7 m& K/ |$ g
/* 注意乘2,处理幅度 */ S* z* \ u3 R4 m) O6 f1 @# p
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
/ C) M1 U5 k& ?: A1 V( T+ w /* %% 行列转换 */
, Y. _( K' D7 w- c+ n' g1 W5 i yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
+ I! J8 _: e' I for (ixstart = 0; ixstart < 81000; ixstart++) {
! h/ F! H+ h' V4 W1 H; l$ f, g7 B youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
! g. K9 [0 W, g8 w0 Z% Z. W# }4 Z - yiDuanShuJu_mean;9 t& y3 p. Y ?# Q' V0 N
} Q& e7 U7 l6 @0 a; h
0 X2 b, n4 q5 b9 ~4 s /* %% 应该对数据归一化,但是这一步放在哪比较好 */) l5 C' T0 \. j( e6 [ O' v% U* l
ixstart = 1;+ `$ }+ z7 I" m% G5 g1 ^
mtmp = youXiaoShuJu_QuZhiLiu[0];# G" O, E8 H+ S' j0 m9 j
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
, k7 P/ L/ [+ L$ n' I ix = 2;
; G7 J' H" ?0 A" }- {) L1 P exitg2 = false;
" s- [' y4 R+ Q- E( H while ((!exitg2) && (ix < 81001)) {
: A5 i6 T( A" P: M. E ixstart = ix;
# M+ W) T7 a# H% a9 N if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
6 L2 v; ^" { B8 b mtmp = youXiaoShuJu_QuZhiLiu[ix - 1]; u5 l X- K% D; G2 f: X. a
exitg2 = true;4 X7 q& G, r% r; ]9 X" [, ?
} else {# F1 G$ O) x" z# Z
ix++;( M/ P4 N# s& f
}
d, J! x# G+ I& L }
" y: u2 F/ {* z9 D }% r' v3 V* Q3 T: n( R% |
- Z; O! ^: p- m* _7 t! o+ _
if (ixstart < 81000) {
7 ~, f$ Q# F) U ?) }$ c while (ixstart + 1 < 81001) {
, u- ]( ^$ W8 q5 }2 v% |* m if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
& o/ l( n6 I. ~+ { mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
0 v$ I! l) a6 P$ W' K }
- _" P9 |4 N* |5 [/ L2 H1 j5 G% M) J$ J" L
ixstart++;5 W5 j0 S- E+ ^( y
}' y) j( X3 K7 s' I8 F+ E: `! k6 x
}
, p- c5 q `; a! V# I8 O3 z3 l1 K; F: v# D, V9 x
ixstart = 1;7 _* |6 ^( C: _: ?& ]- s
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];2 T5 F7 E, P7 W) c) y" H
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {. F. g K* c L8 u% c, |4 v
ix = 2;$ y* q" V6 s; _/ V+ i: b6 h D z3 n
exitg1 = false;# }8 p8 {" P4 G/ I1 @, f! C
while ((!exitg1) && (ix < 81001)) {
' [* v r8 ?" J* {5 Y/ q3 D& V ixstart = ix;1 f" h( [8 I" p7 ^
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
9 `. f; Y0 T7 v1 i$ ?3 D: I- [% F* y2 C yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];. T- G0 [: y5 \4 ? |* p7 S( l
exitg1 = true;
# R9 K; P9 E# O# T } else {
8 i' F" Y) @/ G1 R: Q0 O( s( | ix++;
9 j& O& i0 \6 }" H, T! e& q& b& C" ` }
7 Z' Q0 r+ @4 z- t }. ?; Y& I' A b- \/ b y8 z0 W6 F$ b+ L
}
7 ]8 H0 V5 Z& Q+ N( K
+ a' W, Q1 x/ V if (ixstart < 81000) {, }# N4 m, f, A
while (ixstart + 1 < 81001) {6 k& E0 C. O3 I+ |+ U
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
, W k; O3 M& U# m; n# I! D yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
9 j; s8 d# [5 p/ O }
3 @4 A4 o8 s: }1 a) G
5 s v" y( L) z" y ixstart++;
3 ]% }- x: W. r$ Z O }
* Y' k) [, M7 G6 `7 m8 x1 ~" N* e }% k& K. A8 s' a" u: K& ]0 w& v
# b- O! P/ V8 M1 o5 ]7 w. v yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);& L9 h* d2 M* s$ \2 [. V
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
- a0 M; e1 O" w% L, j4 J+ Z yiDuanShuJu_mean = mtmp;; H" K; Q# i) E& r
}" E. f$ E2 p- H- W' n6 u+ @! V% F$ s
2 I8 T" j4 O7 O, c' G8 g
/* 找出极值 */+ S* }+ R* E; n
for (ixstart = 0; ixstart < 81000; ixstart++) {
& F) Y: b& z& R/ |, y$ S" v' [& [0 n youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
1 N+ |3 I& G# b) l. | s0 Z }
* e' }7 c4 |, |: _ s, Z5 v6 h0 z2 c; E. e% `9 c$ V7 U
--------------帖子字数限制------------------
8 h4 I9 e" _1 E' ~9 _! s" a}' _8 p" H9 w; @; W5 F6 Z; S
8 J' X8 b2 ~3 }% R. L1 J
3 ]; d6 I) t! V# }' h
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|