|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
; t D, s0 Z$ R4 A! k0 S
3 K! g3 ~" }, c. T: ?各位大神:
& d1 H+ D9 S! X 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
9 Y/ h3 ]+ u3 p E' } 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:7 o: [. e6 {& T7 q" V9 k
0 z! p* x& R0 \+ |8 R/ g4 Z( O 7 S& D4 N6 V8 b1 N* C
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。1 z) F" M2 ]0 ~1 b, n D# U
+ G$ C5 p0 `/ e; |, g1 [并没有其他线程
( Q: M! c$ U8 a2 o3 X反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。5 G3 |3 F) W9 y) ?5 i
也说不定是和堆栈有关系。。。。。。
4 C( N- J. T0 R- t9 {请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
3 d4 t: [3 I. Z% q# R) ~4 m7 d- [0 H x- B& D: p3 U5 K& s) y
& {! I! @7 ]9 e+ N j: K. `6 Z, x- {
我也很绝望啊,希望大神能帮帮忙,感激不尽,!( r; Y9 `% I5 [+ {. p
6 c, F/ X$ u1 M+ q5 {" S
# l+ w% f$ R1 k- V
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];2 c9 B' x, `! P
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。) Q2 c' ]' S; D) w* L1 }: e7 V
+ ~& c9 b& `3 P- B. k9 L7 K; Y
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(3 z3 c8 {) b; e/ m& h
const double data1000[1000]) {1 r: J/ b6 C) i7 \% b
' }/ j* W1 {" k" m, B# y int myfuck; b/ X: v& \" J1 E
double yiDuanShuJu_mean;
. J# Z2 q. O3 d# Z' s% A1 ^ double yiDuanShuJu_LowMean[1000];5 |' s" X: I# P* m
int ixstart;
9 V7 E- P: r% C) C6 @, P: j2 Y double dv0[1000];: b* j8 H. [& T
comm_AGC pAGC;
" [$ I% W: l- C1 R& u1 D8 ]! b7 ] comm_CarrierSynchronizer pFineFreqCompensator;! h( z: f' x; v8 |
dspcodegen_FIRDecimator pRxFilter;
. e- ?6 C5 V6 i0 ^& M: X/ I; @ comm_SymbolSynchronizer pTimingRec;& i$ M W6 I- O- v: j8 `
comm_PreambleDetector pPrbDet; @( |5 o" i% |1 x1 w
FrameSynchronizer pFrameSync;
+ S" k2 r+ \1 v3 Z( G0 z QPSKDataDecoder pDataDecod;
6 j9 w$ j6 _) |+ P static double usable_left_filtfilt[81000];
% |' i+ O M* `3 N+ ]1 I8 A- z static double youXiaoShuJu_QuZhiLiu[81000];5 e/ Q0 h/ | N' r9 n# L0 ~
double mtmp;
' C+ o9 e- B8 S. K c. T3 K1 H0 ^7 f* i int ix;
2 G+ H) _* Q& p+ m8 p boolean_T exitg2;
5 ?9 ?5 F/ a, u boolean_T exitg1;) ^# s7 H2 \& q7 j' @8 J6 I
double YiZhenShuJu[800];& ?9 {, P D& ?6 y0 e
double dv1[800];
% K/ s: q1 W+ G! e7 T, t4 z- Z( J& \4 Y
+ g6 P: Z5 a; W) F" k" z double b_YiZhenShuJu[800];1 S3 j- H& m9 k* w) Y
double I_filtfilt[800];, q5 C, M5 J+ d) q
double Q_filtfilt[800];
; _4 |" e2 B F9 ` k) r creal_T b_I_filtfilt[800];
/ p# A3 B/ i: c) H! i0 \, ] creal_T b[800];8 F% \7 `$ M& ?1 E- l8 r% h/ u
creal_T RCRxSignal[50];* C0 J# N* L4 u5 x1 P7 c
creal_T fineCompSignal[50];
9 `* F4 J3 f4 j3 U9 T4 I, X/ B. ~ double phError[50];' m; k+ w4 g& }+ F- L
creal_T timingRecSignal_data[28];
5 \) m( K4 h8 f2 {7 `! X int timingRecSignal_size[1];
& G. _' g3 v; G) W7 ] double prbIdx_data[28];
" X! M- P; R& n+ U. D int prbIdx_size[1];$ A; ^* M% l5 M7 m3 j$ J5 x7 k
double dtMt_data[28];
0 s7 Z- i r$ g, q7 B/ I int dtMt_size[1];7 G8 j, L; X, Z8 ^
creal_T symFrame[25]; M# z* N! W5 _
boolean_T isFrameValid;
2 v' d3 s6 B/ H double unusedU0[3];# f6 Z: V% v+ f/ o; j9 J
7 O0 _4 l) A2 U/ k0 h$ |
//调试过程中的变量
9 z. y/ l, c5 I" n/ F3 l int enough_data;
( e; h% d5 {% Z' R
' j; b7 t5 R9 q" R* }, j- a8 _ int enoughDataFlag;
9 G4 K. u3 A. [1 m4 h int yiDuanShuJu_mean_int;2 e- n k8 T7 g- k
int int_sum_dv0;
% z2 s$ T" d9 p$ u7 c7 T3 n @2 m int oo;
2 a+ s( ?8 k7 n: H" l int ii;
4 ~' V. \* _3 C myfuck=10;" O3 i7 R) F& q" }$ T( u X
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
* R) c: v$ ~, o- b' H% E6 j /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */* Q; `- K& I0 W/ i
! D; i I4 g6 E- }7 P2 r# ^ yiDuanShuJu_mean = mean(data1000);: J) h) N8 a. z& M- L
5 [/ i7 n! I% U W yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
$ g2 p$ N% Y0 U, b* L" N) ^ UARTPutc('A');! q: H8 m0 g1 ]
UARTPutNum(yiDuanShuJu_mean_int);
& r& I( R* w; b: y s. f9 c) e UARTPutc('\r');
2 m* p+ g6 k( l8 I* _; o UARTPutc('\n');
# u( {& w$ O0 j. `8 j* V$ Q8 H$ |/ `; N, i# k$ M& L
for (ixstart = 0; ixstart < 1000; ixstart++) {
! H! k# ^/ g v' o: x yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;% f$ n/ {( h6 W
}
- L5 {/ ~$ q9 {( {6 _
- ], [& O+ a+ f6 Q+ E power(yiDuanShuJu_LowMean, dv0);
3 |6 K) } f+ L4 k4 {: T$ J7 n2 o8 ^) W! c8 c
int_sum_dv0 = (int) sum(dv0);
+ e+ {" u! V' E0 d6 i
% Y7 p% C6 U' o( h: X4 C. x4 i. k UARTPutc('B');! I; C. B2 R6 w0 ?. Z$ [- Q
UARTPutNum(int_sum_dv0);6 g3 B+ F0 H" A
UARTPutc('\r');
( @ X, B+ G& p" x7 M2 l" Q U C4 Y+ f/ V UARTPutc('\n');0 P; D# W! u7 W) w+ C- s
2 ~) H' [2 h8 \; K1 ?// int compareFlag = int_sum_dv0 > 1.0E+8;
+ i, j' H( }) z. }) P$ H0 v1 Q8 I( c" b) @
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?/ a& f1 L2 n: P: S5 Z. R8 Q) T
UARTPutc('C');7 c! J5 }3 O2 \- a5 q
/* 比较信号能量 */- f1 \/ K) C- N( B$ i$ \ Z( w9 e
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */( u3 h6 ]3 d! k
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
" e% l M/ r. k! Q// for (ixstart = 0; ixstart < 1000; ixstart++) {, ]3 n1 } o% e9 L
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =, u6 B3 R2 S! r, W/ i$ D
// yiDuanShuJu_LowMean[ixstart];/ D; I/ _6 t, Z5 {
// }; H g- }4 F" E ~& s5 A
//) |0 ~0 |$ F6 a% W( m$ e% d2 U
// youxiao_k++;
4 X" ~9 {. u h0 _// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
7 D, }8 [& L+ T! T# S+ u% H// /* 感觉要取21个数,即0-20, */( w, G: e- K8 l( h! R2 e
// enough_data = 10;//有效是10,无效是0
) s! k8 v# b0 D; M5 H// }
% Z; y4 P7 l3 D/ v% S }
|9 Z9 p+ q$ J2 t+ t: O% {* ^' U% `- E% C, J+ V* }
1 Q/ S9 s7 x" k" [- p& b) B6 b
enoughDataFlag = 100;
+ D2 a; |* g. v: j5 L( h" r: k enoughDataFlag = 1000;
# A8 `3 ?5 r) y enoughDataFlag = 0x02;
0 N4 S" _8 F0 [: e enoughDataFlag = 200;
( E5 y2 c7 I P" {9 p* ~5 v8 l1 \& A. A8 P
int myfuvk1;& |' W2 x% O g+ J" n
myfuvk1 =11;
$ C/ ^( `5 A1 j/ r
' j& Q5 s4 H( l5 r" U0 M# l- W/ E- u V3 O# S" t1 N
enough_data = 0;8 M1 x0 |2 x' n; ?9 u
3 X% T# L* y, O! U& Y& Z/ x
// if(enough_data>50){; `) `3 R" {$ v; w
// enoughDataFlag=0x01;1 U" Y# H/ C( w3 w0 k" f) m- I
// }else if(enough_data<50){
% |1 L( G( B, Q0 i- z, e7 v/ C// enoughDataFlag=0x00;//0x00还是不行( _2 T+ V# e7 G! a* k$ v
// }3 e4 g* G @6 e$ [
R/ C3 e6 Q0 X0 E1 k2 m8 Z. Q7 P* y% ~) P3 k8 ~
oo=10;* y, p7 M% E, f, t9 E4 C
oo = oo < 5;
7 D$ R- L u" T2 c if(oo){
0 m% ~% m+ F! p) n ii=0;
" H# _" P n; J/ o5 b }
* F# d1 G' s( ^ if(oo < 5){
" V- u" x0 D7 l; o ii=0;
, a' b- f4 \; R( Z. @2 x+ s* B }2 Z0 T* C3 i- |$ v5 s4 L+ G
if(oo > 5){0 d" b( H9 p# V3 a: u9 r$ t% y
ii=0;
8 b: z8 |: w' e4 U }# e% S, l& w" w3 Z5 o. P! t
( L5 ?: h5 W2 y. c& H5 F9 O; @ /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */8 K* u6 c c4 s5 A- E j4 d/ `
/* 如果数据足够才执行主程序 */
' L' Q/ s5 k# S0 C3 | oo = oo < 5;% H+ ^+ Z m5 h J
enoughDataFlag = enoughDataFlag < 5;
, A2 B8 }: Q9 c8 p: P6 S0 O$ y9 J if (enoughDataFlag < 5) {
{- s* U6 M' i# H) g0 |* I// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0- F/ O5 y1 L1 F( y& m$ I
AGC_AGC(&pAGC);2 C1 x% W/ V; ?* _$ u
1 j8 N' ?/ T. n; W3 p7 i
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);* z/ \$ y2 n5 U
FIRDecimator_FIRDecimator(&pRxFilter);, z8 Y8 G+ H; H, u L$ q' \8 ~5 i
; k4 W3 h t+ n1 N9 Q- I9 W /* Downsampling */ w5 }3 g4 O& ]2 F1 H
c_SymbolSynchronizer_SymbolSync(&pTimingRec);6 k% G( ~7 I/ y
7 X9 ?4 G& u6 j; ?$ m) q8 \3 ~. e c_PreambleDetector_PreambleDete(&pPrbDet);
- Y8 w# V4 U4 Y- i/ o) X6 n! L3 M7 o
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
* t& b2 c' e: ?6 ], X& a$ c% ~ /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
5 J# R: m8 r$ r6 q: \5 t /* %帧数量=100 */
/ {9 O; X4 |7 I$ ~4 m" D: y pFrameSync.isInitialized = 0; o( C8 H" j3 [* S0 {6 C# n6 y
7 ~' k( |/ B9 V- C* \ /* [EOF] */
) o! c$ e7 Q. K( Y /* 前导码长度是13 */
: r! d# p( J4 A( c: f8 p /* %qpsk */; \% r6 a- T, y+ r* ~2 D z
pDataDecod.isInitialized = 0;2 B* Z: a* [9 U
( i. `5 a+ p) {$ { /* end */) T' l5 s6 U5 q, _
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */ Z" E W4 o2 N
/* Convert 3-dB frequency */
0 A6 u( v( B0 ~; M. c/ S2 X /* Convert 3-dB frequency */
p: v- r9 J4 h9 @' d filtfilt(save_buffer, usable_left_filtfilt);' n5 T9 @$ o. p0 z
for (ixstart = 0; ixstart < 81000; ixstart++) {
# C3 {0 e3 l- K" @ l usable_left_filtfilt[ixstart] *= 2.0;9 }# z( H. f% P9 L& w: r0 z! W
}& y" i$ u' z0 o, x+ x- i
7 Z' T$ x! M& m5 O
/* 注意乘2,处理幅度 */) s K- {' |( X0 O9 D
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */" v0 R3 G/ V& ]
/* %% 行列转换 */
2 w6 u2 d; ^- K( ^/ t* z) X6 c yiDuanShuJu_mean = b_mean(usable_left_filtfilt);$ w5 s( z$ H2 O" D7 E
for (ixstart = 0; ixstart < 81000; ixstart++) {, v' n1 p. C+ e, O/ I! f
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
# O: b; D- I) n; s - yiDuanShuJu_mean;
0 Z3 I- s* y( x8 F% A }
3 a( X; O$ G8 r) z! p) N
3 s) o& }0 \8 b# \. C /* %% 应该对数据归一化,但是这一步放在哪比较好 */
$ y9 G0 j: w( a8 A, {! x ixstart = 1;0 G4 a8 j- h0 M) s+ |" U( U
mtmp = youXiaoShuJu_QuZhiLiu[0];' J; P& A) q; j) L3 X
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {/ Z6 B% Y+ q3 R. m& N- x- `4 L
ix = 2;2 a6 |8 f, D4 K) Y2 o8 P) Q- ~ w
exitg2 = false;
& _' Y6 \: S5 _: ^% [9 l7 Y while ((!exitg2) && (ix < 81001)) {
# K6 X: c/ |0 M ixstart = ix;. x0 R+ j3 F& i6 D$ N# T
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {* B' j* E& ^2 X+ S. Y3 f
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];% g+ G+ t {4 l1 U
exitg2 = true;1 { V6 Y" }: P* Y; U" \5 [
} else {
) l; A3 [9 I" Q% [5 Y- b' ^- Y6 i ix++;
( w& Q Y$ P% M3 `4 E' i% ] }
( E! Y, v: m# h4 Y8 h& f }. d6 V- N/ X& V
}: H! s; _0 p0 I( F: c
7 E) ^( y$ a3 F8 J- h) I4 M if (ixstart < 81000) {( V1 ?6 Q7 g* E; P; P" T) B
while (ixstart + 1 < 81001) {
0 `: G* k3 z# l: a5 U: d- h8 O+ X4 d if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {& o h: f( D' o3 |
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];$ \! U7 |7 w V/ t \! ?
}3 ~ e$ d5 ^* j: @$ c5 {, v* V, u4 y
' }% ^; c# _4 z9 }. j ixstart++;
: i# q+ V! t( X% A }- u1 _& O' _) X$ J R
}9 G$ [/ S1 ~& e `
6 d" N$ E2 `3 I* ^. F
ixstart = 1;6 t7 b. l* i& ~- J( B: r/ V0 J8 ?
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
2 Q+ n% L& f1 Z' s1 O if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
. M1 i, ]# D9 s! C ix = 2;, o+ _7 [) v% i, t
exitg1 = false;
+ Q8 r8 g0 c% I while ((!exitg1) && (ix < 81001)) {2 D! ~1 d( u& i7 _) Y$ r' s
ixstart = ix;/ W' C% `* O6 t% C* n
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
% g* c: c0 u: ` yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
0 d; x( ^ Y1 b$ C1 @8 M) [ exitg1 = true;
# ]8 J* T, g2 ^3 ^: `6 Q } else {; `0 v9 u/ ~2 y5 Y
ix++;
' R3 ]% H, h5 Z/ h; O }
4 L4 }& h2 D- N, e" [$ D }
; j* G2 a9 i2 ]8 S }
2 F% i" ]% o \7 `6 b5 n( R0 a K& [: H2 G% n* ~$ R q2 r7 H' f4 z
if (ixstart < 81000) {
# p6 m) ?8 ]$ j; Q3 X- [8 k while (ixstart + 1 < 81001) {
^0 l# S2 W; |3 Y3 _4 w if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
8 k" s+ p' Z1 X yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];% P$ r& x+ i; |; u) U8 T
}
# u% I5 I. v, K9 f, n
0 T4 ?: F% x8 D1 Y$ F* A ixstart++;" S( ?4 r; ]6 l/ U
}
* t `7 X: B$ U; x: o& T# p }
& c7 [% r3 k) r, i% ^
1 A& E1 k# P- }6 F' T4 Q3 T yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);! w$ x- a$ Q! e* t2 G0 k V' ]
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {2 ?; Z1 i8 J1 u" @2 D/ X) u
yiDuanShuJu_mean = mtmp;
. F, r" l5 b: o) d2 I/ F7 u. b }
, Y% F' H7 K7 Q3 R- Q2 L
! V2 @% y d$ g0 ~, N( S /* 找出极值 */
; H3 g m; H: y! b for (ixstart = 0; ixstart < 81000; ixstart++) {& t6 e. M6 v. n6 ?' ?. j, G
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;* N# E( Z P1 R- _
}2 x0 e6 h; s3 A$ I5 k
& i/ y, p& x7 i$ d% | --------------帖子字数限制------------------( r# o0 P: A0 K f/ u; p
}
, w: a# l/ l X% a7 A4 Y5 E9 D4 a2 z7 y" @9 K8 ~6 C% M. M; _. Q
, t f' {' ?+ U: x: U/ |# V |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|