|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 ; B6 d) B [1 [6 V
# A, \6 t8 o- Z; |各位大神:: Z4 L1 x4 R9 F
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~): O4 a' l; P3 o* X, ?" [8 d
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:- G4 x6 q7 j' _# ?3 y# s9 a+ i7 O
, h: v$ Y5 M' s1 K+ c% h6 Z- Z
: R% j- f, Y+ u这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
. b6 p( P8 d; b0 }+ X! k
0 c9 a$ L$ L$ K l! w/ l并没有其他线程
$ N3 Z. V* b& X% d! K( R% H+ ^7 E反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。- {2 J# ?* t. a8 N0 ~
也说不定是和堆栈有关系。。。。。。% @7 f# F+ G# d, Q j% f' Q' @
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
0 a& s0 v% P- g+ C) L! V0 u) B8 v( _" |
+ a# F/ U% q8 j* p" G3 R0 a: G3 @( |+ E3 P3 j3 g0 Y
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
* @9 w7 v7 E* k/ @4 F9 p( ~8 L1 ^! v% Y( R5 H
$ y4 W0 Q6 c7 L
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
( U9 ^% \2 p0 _8 R# q static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
6 k4 k, ~' N ^$ B, t, p; J6 O6 ^ N) I' j& ?
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(% d. J0 S: ~# z5 `! a: f
const double data1000[1000]) {
& S( s* y/ O2 o% d& [ C3 L4 C" n2 C$ X1 R- n6 k3 \7 q
int myfuck;. e% [0 R9 H2 x
double yiDuanShuJu_mean;
! h+ y2 `' U! i$ J/ f; q, d6 o6 [ double yiDuanShuJu_LowMean[1000];1 J3 `* x& v# p, T1 _1 M0 `% j( Q
int ixstart;
: R/ A* g7 i3 K. Z double dv0[1000];
: S4 S7 k4 f7 V3 @! q2 l, z comm_AGC pAGC;& ]% V+ C: i3 a0 I+ n/ B" G$ H0 L5 c
comm_CarrierSynchronizer pFineFreqCompensator;
4 {: B8 i: Q& ]; A) l# e! W% ~ dspcodegen_FIRDecimator pRxFilter;% c# I) i; {0 q* H# X
comm_SymbolSynchronizer pTimingRec;
' H; J& t7 c8 y comm_PreambleDetector pPrbDet;$ z$ t' F% n. L# i6 [
FrameSynchronizer pFrameSync;
1 m L W, l6 L4 a1 Z) R3 K9 a QPSKDataDecoder pDataDecod;
" p- r7 y4 a: y2 j3 V3 h7 ]' F static double usable_left_filtfilt[81000];
0 j0 ?0 @+ R& O static double youXiaoShuJu_QuZhiLiu[81000];
% e3 `8 O+ l* @2 C double mtmp;& D; v8 B, {; r$ y" \9 I
int ix;
: U. D. l* x0 r9 E! K boolean_T exitg2;: X; m8 Q& J$ Y. q8 g4 n
boolean_T exitg1;
+ M, Y$ i4 a2 r. b$ u double YiZhenShuJu[800];0 V: s. o0 Q, W2 D( B
double dv1[800];
7 y. z2 _5 R/ @) \3 g+ v8 q2 g9 |4 @8 K! ~4 `
. ?3 Z' b6 [. r# w7 V double b_YiZhenShuJu[800];$ c# |4 c- L1 k' P6 D
double I_filtfilt[800];
- X1 W2 p2 D9 U( c6 y double Q_filtfilt[800];( `" @1 F% o- G% C# M
creal_T b_I_filtfilt[800];+ L- t6 V& g+ Z3 z/ x
creal_T b[800];
g8 h" Y" d+ z/ V7 v& w creal_T RCRxSignal[50];
: C: b# S% V4 {- {2 ?! F creal_T fineCompSignal[50];
- E E9 E' {7 W. x! ] m double phError[50];# y( T; W( B) }8 f f" f
creal_T timingRecSignal_data[28];
, g& W- z+ [) t5 p( ?6 A/ t int timingRecSignal_size[1];' A% g) N# o- h0 h- p; \+ [( Q' R
double prbIdx_data[28];" D- [( h. n! l
int prbIdx_size[1];0 `& O' Y( m H# ]+ U
double dtMt_data[28];8 f+ ?3 N- I. V5 B$ H$ M; g
int dtMt_size[1];
' w3 E6 G+ d1 n6 J4 M0 r creal_T symFrame[25];
7 U/ F! o2 F, W- Y' d! ]; r boolean_T isFrameValid;
3 S5 N5 j1 e2 _# w double unusedU0[3];2 E5 y) h8 l# q" D q' U+ E
, n' u$ T3 d) l6 S
//调试过程中的变量
5 V* ~" X! h# |$ \ int enough_data;
; H6 z1 ^1 y* n3 ?! ]8 m5 {6 i
: n0 C! p1 B# X( r+ C1 p int enoughDataFlag;2 i/ a+ K0 S4 ^' P; T
int yiDuanShuJu_mean_int;) y+ A- o/ T/ R3 a& o9 _
int int_sum_dv0; }2 C. o3 R& P+ e
int oo;
! R: f! {, q7 ]5 L5 u. j int ii;
" x% d9 z5 \& I9 ^5 E: h myfuck=10;
; x/ k$ v( E1 G& F1 K# W /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */0 X7 u- e0 W7 P* i
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, *// p1 b0 J( F& _6 z' W
. Q8 j! {- ]0 a6 P! t! N( R6 A yiDuanShuJu_mean = mean(data1000);0 j, f2 r- I, ?8 ^2 q2 F: `
* |4 c+ z* k, p6 D0 e/ Y yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;( ]" { M4 q2 u0 s* [% c
UARTPutc('A');. \5 z; a9 Q) u- C0 C: W
UARTPutNum(yiDuanShuJu_mean_int);
$ L" [! S: x7 q5 s( S* J UARTPutc('\r');
" A6 M$ a# d3 {/ C% c, V0 G/ ~9 o( m, [ UARTPutc('\n');7 g8 Y8 t9 @& D3 e
% d' P" W9 E; V' Z8 l: W& A* c/ B
for (ixstart = 0; ixstart < 1000; ixstart++) {
& j3 U4 l4 S) C9 K& { yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
2 t, o, O+ m9 X' G# M9 y G$ F' A }
2 ^: }4 K/ p' f" H V& h
1 q! p, w. K+ @# N- F! Q power(yiDuanShuJu_LowMean, dv0);
* m( C3 Y6 c! Y) G# Z: f/ [( z$ ^6 K1 o2 N. z. T& f8 }* l4 k
int_sum_dv0 = (int) sum(dv0);
. P4 I5 z) t! t. H: x; l
" F4 }9 H5 E7 T7 l5 [ UARTPutc('B');
) Z& ?! _5 A& f# h* d, L UARTPutNum(int_sum_dv0);% N+ {( ?! n: H
UARTPutc('\r');
" P& X5 w/ l& B( p P6 {6 j UARTPutc('\n');5 j( [" b T7 `1 g8 {; R
* Z& b% y9 X: {# ^9 C/ ~: r// int compareFlag = int_sum_dv0 > 1.0E+8;9 E% m* Z) }4 Q, I F% X3 C% w
8 f6 g7 k7 I5 n! C! l9 i
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
8 N% d! ^' C- @) u3 _. N1 k _# \ UARTPutc('C');
& e7 i x2 i! ]! X( o /* 比较信号能量 */
7 _6 c) C. P1 P) \ /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
( i( ~7 C( F: W9 R+ K. K' p8 t// yiDuanShuJu_mean = 1000.0 * youxiao_k;
1 H" }& v( I2 O0 G6 E# H// for (ixstart = 0; ixstart < 1000; ixstart++) {
& k& O4 O6 Z1 A2 X// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
) w! U1 B% n4 f4 F* {( ~! s5 P// yiDuanShuJu_LowMean[ixstart];. ?% {( H/ t9 } Q2 W; s1 t! `
// }* k- Z: ~7 `; |4 ]2 E9 \+ ~
//
" E, b1 V/ @ I/ r5 d// youxiao_k++;; K n2 k2 m9 {4 |4 \9 Y
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
1 q1 [( i. S' ~& M5 S g$ ~/ G// /* 感觉要取21个数,即0-20, */7 O2 @, [+ o& }3 {7 o/ V6 J9 i% s
// enough_data = 10;//有效是10,无效是0
5 s2 L. u* c* K2 b// }
; C5 f8 x W5 U1 ]" W0 r' m }
- a0 Y6 T: D2 Z. I" h% d( e
3 s8 e& \6 S6 d' @! I8 ^9 h/ F) S9 Z: E6 w0 Y7 A4 X! M
enoughDataFlag = 100;" F) S. ]1 S- S" l4 y( p1 k
enoughDataFlag = 1000;
3 v+ \+ Z: R m9 {4 h( `: | enoughDataFlag = 0x02;' M" `$ \3 [: M# b2 ]: e1 ~
enoughDataFlag = 200;1 l. Y, i9 ~& \) P+ `8 R2 P
; h2 l4 X r3 j& Z5 t( \& G
int myfuvk1;- R! `- N" S' l% n) o7 P
myfuvk1 =11;, `( F8 n) d! c" W- v! u2 ]
. Q8 K, |, G$ f7 X
0 D& S L4 q9 _! l, M$ C enough_data = 0;! \. ]# w# l; r: v6 @3 \' C! R0 z, c8 G3 Z
; y* ]7 x) J; {
// if(enough_data>50){
. T3 _ O9 O: T, D$ w+ A// enoughDataFlag=0x01;
N1 F M0 G$ H8 R8 z// }else if(enough_data<50){
! F" u1 H' Q; G4 l+ g! S// enoughDataFlag=0x00;//0x00还是不行
$ l; I! q* P$ a$ _& H2 R: F2 X// }7 _+ ?3 C% _. D; }. T* R
) K- [! a+ P) g! ?
9 E' C' l6 _6 l& P& c' U oo=10;
/ d- _$ |: V' c oo = oo < 5;
0 ]+ @- Y0 e' l0 F; U0 X; ~5 h5 O if(oo){% e2 e- K$ P# J9 q
ii=0;0 Y) F9 A6 @+ ?) R; r, ?
}) G# `: o- A2 L: u% T3 A5 ^5 ^
if(oo < 5){
9 |( X9 V& f0 p$ M+ y ii=0;
$ q+ l2 M: W* {! n, J! {+ G+ W. X4 l }
, \; G3 s. N' E# N if(oo > 5){! W; ?; O+ O" ~- w$ y
ii=0;
+ [$ y" a& O- S3 f$ Y. z# E1 D }
( t9 c; o1 U) {4 s4 ]' l0 E' W& G/ q3 E# G
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
& ~% c& W" p5 u /* 如果数据足够才执行主程序 */
7 p* i& E& q& m3 p- V- R2 ?6 N! h oo = oo < 5;
8 e; X1 f% U, Z" L5 V$ E enoughDataFlag = enoughDataFlag < 5;# ]0 v, b, H& z9 D! E+ n W
if (enoughDataFlag < 5) {
% |# X [9 a$ ]* C// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0# ~9 M6 V( N/ ]# H3 v; A5 @, U
AGC_AGC(&pAGC);
1 o' @2 }; G, o# E& R' t5 \- m& `1 r& G6 E8 ~9 P9 N
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
0 H2 k3 y R9 E/ f$ c, q" R- k1 L FIRDecimator_FIRDecimator(&pRxFilter);. l* k. N- H6 `3 F7 A* f' k
( M# G( h" q/ F5 x( P /* Downsampling */
3 ]+ P5 \5 T1 \7 t2 M4 m+ C. U1 E c_SymbolSynchronizer_SymbolSync(&pTimingRec);
) S" e7 P1 F& H
# R/ d8 N$ {: s3 N6 t c_PreambleDetector_PreambleDete(&pPrbDet);
, n2 @/ G- A. W2 j' N1 u3 Q7 d" u# l9 e2 {3 P& C
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
3 h; V5 m0 X. F) h0 \1 t3 w/ x% d p /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
9 t% I( S5 l5 ~1 |- q" M5 k /* %帧数量=100 */; L! H' S5 s" k# @. K% z3 h" j: X
pFrameSync.isInitialized = 0;
" ~3 D9 t W' {9 q* A& f2 R% Y* C; k Q
/* [EOF] */' _: m! L/ ^3 R
/* 前导码长度是13 */
% ?0 W+ C+ A- C /* %qpsk */% u6 E6 E) O. s. ^7 ^7 ~7 J+ w
pDataDecod.isInitialized = 0;! t) P& r! R( Q0 `( Z/ u t
/ }* M' H) t* _. r+ S% {% @- l /* end */, z% Q1 l0 g8 x, A/ ?, |$ h7 F
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
3 |5 u+ V; U; D# F6 Y /* Convert 3-dB frequency */: e# ~3 a' u/ v% @. f
/* Convert 3-dB frequency */2 a; _/ @6 t3 {# K3 Z* q
filtfilt(save_buffer, usable_left_filtfilt);
e9 |$ a; F7 w for (ixstart = 0; ixstart < 81000; ixstart++) {0 i2 E% O+ q6 _! i
usable_left_filtfilt[ixstart] *= 2.0;
0 K- }" |8 L: _+ ]% i) I, d+ u }9 J$ y/ L6 j# Y$ P( u
& V, ^% h& Q3 ?' _1 A; K
/* 注意乘2,处理幅度 */& a/ p) Q$ P3 s+ x$ I0 T
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */( d4 l5 k8 p# @9 Q
/* %% 行列转换 */+ I* R1 k' B5 v, |. j! \: u
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
8 t# F0 Q# Y* ?8 @1 ~+ w5 F, t for (ixstart = 0; ixstart < 81000; ixstart++) {5 C& w1 z! y" e5 c# Z- v& v
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]& n' h0 l. w$ e; T
- yiDuanShuJu_mean;
- V7 V6 I9 N; f* u3 L }# g. d# i' |% Q) E* H
M Q* y5 i6 }: Y/ J/ o& V A' P /* %% 应该对数据归一化,但是这一步放在哪比较好 */- A. h6 K' z2 V9 G* p
ixstart = 1;
( N/ t- Y" _: ^% z mtmp = youXiaoShuJu_QuZhiLiu[0];
- [6 f T2 v$ E( u7 x' J if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {0 c0 A- s; U6 r( l0 g" z
ix = 2;5 X d$ s- e, b1 p) t; o6 f; ^3 z
exitg2 = false;% L* Y8 J$ V: {, u8 q/ `+ H( Y. `
while ((!exitg2) && (ix < 81001)) {
( f) [( l5 L5 g, t ixstart = ix;
$ C1 f, c# l) j! e: ?7 E, c if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {2 y- J7 _ F: }+ C3 `- F$ m$ E
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];- C: }$ R* J! o& x: ?$ ?
exitg2 = true;; G2 t" L$ d2 F8 J8 e. _/ N
} else {* X3 Z9 p0 n/ {1 Z5 A
ix++;
4 X% L5 W; R- L }+ u! m, R; E5 Q- N( t, f
}
5 C% _* e) Y+ A1 ?( R }
- M8 U8 G/ {) D# z: l5 ], `! P
# F! |* h+ R1 B" k& P& j if (ixstart < 81000) {3 E8 }, ]# Q. R, H% \. d9 w/ e
while (ixstart + 1 < 81001) {
0 _+ V+ @% A: m+ R8 b2 m if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {# f* |( w% u8 u
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
1 V/ n5 \% D( C }8 \ z2 q* }; b( c
* [# ~# u9 p9 S; `2 {7 l
ixstart++;* k3 z# S, N% ~' }. N. f/ K) O
}
, c+ j0 b( u2 i3 W) ]) } }- t9 E3 w) z) A1 l' Q7 r
5 l- Z/ V( @$ D) O' w6 s3 m ixstart = 1;
! l# ?1 n. E$ [+ V% v yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
: [" c2 q6 j/ D9 g4 |3 b v, p0 `7 O if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {2 D1 A( u& @# h: E2 t
ix = 2;
; e% ^' I {, i; K7 y+ W exitg1 = false;
/ w% ]% e X3 r% S3 M) |# \ while ((!exitg1) && (ix < 81001)) {
) h3 u9 H6 s/ \ `: `+ v( e ixstart = ix;4 k' N" i, v# a3 d- ?3 d/ W6 |
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
- I; q! ?/ \/ m1 d! T/ H yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];, f9 t" |7 @, j" B
exitg1 = true;# _. P# i+ Q1 W9 _- E
} else {
7 e6 U a1 f' S# \7 h6 S8 j v ix++;* T& [# s. z4 |0 c
}
" @: i+ i- D3 e0 E2 L# ^* [% o% W }
$ `: t4 }* f: a0 f; r) D }; k2 \, g( Y, \) @, C5 X3 w# A, M, P) F
) a: k C0 F" t if (ixstart < 81000) {
& n7 W' r. _. }: p while (ixstart + 1 < 81001) {
. v. j8 B8 B7 a* ?" n( [% q if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
' G; g' K: E3 m7 ] yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
- {$ `8 f) ?; ~ }
0 a% K7 z' c7 M4 P" p2 h( S4 i4 H: O1 w1 h0 h* B
ixstart++;3 l; F) J5 b; @, b1 D
}+ F r$ f5 d& u) `
}$ |" C: G" t" B, ]3 F- `' [9 V
9 M/ N6 a; ]( J" y
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
% j1 b) K# T0 f" b* H5 c! K9 S if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
+ j/ l" @+ s# J% _0 h yiDuanShuJu_mean = mtmp;* B/ D/ X% C4 T% U: m
}5 K5 i( h$ D9 L1 t: Y
, P8 K# [; O$ Z q" Q/ e8 i" c* e' l8 x
/* 找出极值 */
& v0 D# q6 j" U/ x) r2 E; h for (ixstart = 0; ixstart < 81000; ixstart++) {2 t5 Z9 r& M- {2 z, _2 e) H
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
7 D' c: E5 }; O2 ^" N! L }+ ~3 Q8 L, X Z- Z9 O+ y
. v% X! n- G6 G6 K& e
--------------帖子字数限制------------------" a' a2 e4 }( ~
}
5 f! s1 V- G) [9 p' h
& G0 y% S2 b F/ L
8 C. [; N- h% {" E% v( m |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|