Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.36.192] |
|
Сообщ.
#1
,
|
|
|
Получаю спектр сигнала следующим образом:
M := Round(N/2)+1; //N - кол-во отсчетов SetLength(re, M); for i := 0 to M-1 do re[i] := 0; for i := 0 to M-1 do begin SumRe := 0; SumIm := 0; arg := 2 * Pi * i /N; for k := 0 to N-1 do begin SumRe := SumRe + signal[k] * cos(arg*k); //signal - массив отсчетов сигнала SumIm := SumIm - signal[k] * sin(arg*k); end; re[i] := Sqrt(Power(SumRe,2) + Power(SumIm,2)) / M; end; Проверял я работоспособность этого просто, вместо signal[k], ставил (Amp * Sin(2 * Pi * fs * k / fd)), где fs - част. сигнала, fd - част. дискретизации. Таким образом я должен был получить один пик величиной Amp на частоте fs. Но, в процессе эксперимента, выяснилось, что такой результат получается только тогда, когда кол-во отсчетов N кратно fd. В других случаях вокруг пика появляются левые частоты и амплетуда не верна. Я в DSP не силен, может это так и должно быть. Или может это связанно с характером сигнала (скажем с тем что он периодический)? Объясните. Проблема состоит в том, что мне надо нарисовать спектр для выбранной части сигнала, т.е. кол-во отсчетов - произвольно, да и сигнал непериодический. Если я повторял сигнал или дополнял нулями выборку до нужного кол-ва, сами понимаете, в спектре появлялись неточности. Тем более что fd обычно дробная. Как в таких ситуациях спектр получают??? |
Сообщ.
#2
,
|
|
|
Попробуй плавно менять количество отсчетов(ДПФ позволяет)
Но это поможет если сигнал- 1 частота + ее гармоники. А еще исползуют окна Хеминга, Хеннинга и еще кого-нить на Х... |