Форумы » Форум для внеигровых тем » Знатоки, вам сюда ;)
Cообщение
#380  ahawk
1
+30
17 Ноя 2010
помучить вас что-ли? )))

В общем сам не нуб, но немного не понимаю. Дело в следующем:
при обработке сигнала есть такие хорошие вещи как fft и ifft. Есть входной вектор 8000 отсчётов по 2 байта на отсчёт. Размер на выходе не подскажите? Проблема в следующем: fft и ifft описаны как double и преобразование double в int не проходит есть элементы размером больше чем помещается в int. Это так и должно быть или я чего-то не понимаю?

Всем спасибо ;)
2
+32
17 Ноя 2010
мне кажется тут я чего-то не понимаю, а не ты =)
3
+9
17 Ноя 2010
с радостью помогу. а что такое fft, ifft, вектор 8000 отсчетов по 2 байта на отсчет? остальное я вроде понял =)
4
+9
17 Ноя 2010
1, а о чем речь вообще? =)
#380  ahawk
5
+4
17 Ноя 2010
radiostorm
1. http://ru.wikipedia.org/wiki/FFT
2. смотри пункт 1
3. матрица 1х8000 элементом может быть любое целое число из диапазона -32768 до +32767
#434  kyner
6
+8
17 Ноя 2010
Димка зачётный вопрос задал
я нуб и не скрываю этого
#356  malin
7
+9
17 Ноя 2010
ваще ничего не смыслю. Но по интуиции в результате прямого Фурье длина спектра (точнее, спектр получается чуть позже) равна длине ряда. Обратное преобразование дает длину исходника. У тебя что, ряд int ? Сделай из него даблю.
#380  ahawk
8
+4
17 Ноя 2010
7 так и делаю, но на выходе опять из double int получить нужно, иначе вместо 16к придётся 64 по сети передавать ;)
#356  malin
9
+9
17 Ноя 2010
8. Хм, не сталкивался. А что, это трудно? Вроде бери целую часть и переходи к инту. (Ей Богу, никогда этого не делал)
#356  malin
10
+9
17 Ноя 2010
9+. Кстати, в Матлабе есть куча всякого, например int8, int16...

I = int*(X) converts the elements
of array X into signed integers. X can
be any numeric object (such as a double). The results of
an int* operation are shown in the next table.

Там же вроде должны быть подпрограммы, которые это удовольствие получают
#380  ahawk
11
+4
17 Ноя 2010
9 число типа int может принимать значение из диапазона -32768 до+32767, типа double -1,7*10^-308 до 1,7*10^308

почему-то при преобразованиях получаются числа порядка 59000, а это уже не int

10 вот вот, матлаб и считает ;)
#356  malin
12
+9
17 Ноя 2010
11. Копирую в онлайне из Матлаба:

>> aa=22222222.19

aa =

2.2222e+007

>> int32(aa)

ans =

22222222

не могу сосчитать, но ответ вроде больше 32767
#380  ahawk
13
+4
17 Ноя 2010
12 бери int16 и получишь меньше 32767. Но вопрос не в этом, вопрос в том: это нормально что при входном 2х байтном векторе выходной получается не 2х байтный или нет?
#356  malin
14
+9
17 Ноя 2010
Правда сжульничал - взял 32 битный инт. А из него можно получить нужное значение 2-битное?
#380  ahawk
15
+4
17 Ноя 2010
увы, нельзя. Это всё равно что Землю(планету) в карман положить )
#356  malin
16
+9
17 Ноя 2010
15. Жаль. (что нельзя положить).
А с др. стороны, что-то не вяжется. FFT -> IFFT дает ряд один-в-один. Т.е. и выходные значения не могут сильно превышать исходник. Если, конечно, как-то БПФ не корежил, например, фильтровал.
А что за обработка?
#356  malin
17
+9
17 Ноя 2010
16+. А типа умножить исходник на какой-нить коэффициент (e.g. 0,1), а затем, соответственно, учесть на выходе, или скорее всего, передавать как необходимый коэфф. ?
#380  ahawk
18
+4
17 Ноя 2010
да-да, именно это ))) не просто же так fft->ifft делать, нужно со спектром по развлекаться, порезать его, по переставлять (скремблирование). Путь мой таков:
[2х байтный вектор]->fft->[всяческие перестановки, изменения (но только внутри полученных значений)]->ifft->[хотелось бы 2х байтный вектор в итоге] ;)
#356  malin
19
+9
17 Ноя 2010
18. Ни фига себе. А если спектр получится узкий? Тогда у тебя при обратке вполне реально выбросы могут быть. И никак не влезут куда надо
#380  ahawk
20
0
17 Ноя 2010
19 откуда он узкий-то будет? он какой был по ширине такой и останется, я же только местами меняю амплитуды гармоник, ничего нового не вношу. Он мне как дал что спектр лежит в диапазоне от 0 до 4000Гц, так и останется, только кусками будет сделано не так как изначально, а, например^
[1000-2000][0-1000][3000-4000][2000-3000]
и вот от этого и брать ifft