Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.03;
Скачать: CL | DM;

Вниз

Частота   Найти похожие ветки 

 
Sergo ©   (2002-04-24 13:08) [0]

Как можно получить частоту входного сигнала на звукаху?


 
VictorT ©   (2002-04-24 13:21) [1]

С амплитудой разобрался?

Формула для частоты:
f = 1/T,
где Т - период.
Чтобы определить период, я думаю можно замерять время между соседними локальными максимумами. Если опять выразился непонятно, приведу текст программы.


 
Sergo ©   (2002-04-24 13:29) [2]

>VictorT ©
Спасибо что опять откликнулся. Да с амплитудой я разобрался.
Формула для частоты:
f = 1/T,
где Т - период.

Эту формулу я знаю, а вот с замером времени... если не трудно напиши код.
А через БПФ нельзя узнать?


 
VictorT ©   (2002-04-24 13:46) [3]

Не знаю, что такое БПФ :(

Сейчас ухожу на обед, код напишу чуть позже.


 
Sergo ©   (2002-04-24 13:48) [4]

БПФ это быстрое преобразование фурье


 
Digitman ©   (2002-04-24 14:38) [5]

Вот сиди тут и думай, о какой "частоте" ты речь ведешь ...
БПФ как раз есть первое , что можно рекомендовать. Ты ж ничего не сказал о заведомо определенной АЧХ анализируемого сигнала : сложный сигнал или нет, меняется спектр во времени или нет, периодически или апериодически ... Может, это вообще - "белый шум" ? Тогда задача нерешаемая.


 
Sergo ©   (2002-04-24 15:28) [6]

>Digitman ©
Сигнал предполагается практически неизменным во времени по амплитуде и частоте, но все же эти параметры могут меняться, спонтанно.


 
AFROLOV ©   (2002-04-24 15:41) [7]

Надо не промахнуться с частотой дискретизации при снятии АЧХ - посмотри "Теорема Котельникова". Иначе можно получить кучу мусора (при низкой частоте дискретизации) или много лишних данных (при высокой) - как следствие очень большое время обработки.


 
Digitman ©   (2002-04-24 15:41) [8]

>Sergo

Какой частоте-то ? Какой гармоники ? Если гармоник нет, можно и без БПФ обойтись. Иначе задача сводится к определению частоты осн.тона сигнала, имеющего постоянный спектр.состав, а это как раз и дает повод как минимум для применения БПФ


 
VictorT ©   (2002-04-24 15:50) [9]

Да, после написаного тут наверное надо погодить с кодом, вначале получше разобраться с проблемой.


 
Sergo ©   (2002-04-24 15:54) [10]

>Digitman ©
Частота в диапазоне 50 Гц +-10гц, гармоник: в лучшем случае одна, в худшем 3, количество гармоник я контролировать (они также возникают спонтанно) не могу, но мне их нужно отследить.


 
Sergo ©   (2002-04-24 15:55) [11]

Сигнал моно 8бит, частота дискретизации 22,5 кГц.


 
VictorT ©   (2002-04-24 15:56) [12]

Да, кстати, гляньте сюда:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1018853239&n=3
всё ли там в порядке, а то в свете вышенаписаного сомнения возникли.


 
Sergo ©   (2002-04-24 15:59) [13]

> VictorT ©
А зачем туда смотреть?


 
AFROLOV ©   (2002-04-24 16:02) [14]

Для надежного разделения сигналов с близкими частотами необходим большой периуд наблюдения.


 
Sergo ©   (2002-04-24 16:04) [15]

>AFROLOV ©
Насколько большой?


 
VictorT ©   (2002-04-24 16:07) [16]


> А зачем туда смотреть?

Да подумал, что тот метод может не подходить.


 
Sergo ©   (2002-04-24 16:13) [17]

>VictorT ©
Да меня тоже берут сомнения, можно попробовать загонять данные за кокайто промежуток времени в массив и искать там максимальное значение (to all это у нас с VictorT © маленькое "лирическое" отступление от темы :))


 
AFROLOV ©   (2002-04-24 16:20) [18]

Надо формулы посмотреть - я так не помню. Но чем ближе частоты тем больше должен быть периуд наблюдения.<=> Чем больше периуд наблюдения тем более близкие по частоте сигналы можно достоверно разделить.=> Преуд наблюдения выбирается из следующих соображений:
1. Минимальной разности частот между 2 сигналами, которые считаются разными.
2. Других соображений(скорость обработки, и т.д.)

Кстати, увеличение частоты дискретизации в разделении сигналов тебе не поможет.


В любой приличной книжке по обработке сигналов это есть.


 
Digitman ©   (2002-04-24 16:25) [19]

>Sergo
Если 50Гц и гармоник не более 2-х, что мешает тебе установить частоту дискретизации, равной, скажем, 4кГц ? При такой частоте дискретизации БПФ при минимальных ресурсах системы вполне справится со своей задачей в real-time !


 
Sergo ©   (2002-04-24 16:26) [20]

>AFROLOV ©
Спасибо
Но разделение сигналов не суть. Пойдем по легкому пути будем считать, что гармоника одна :)).
Но проблема так и не решилась :((. Как узнать частоту?


 
VictorT ©   (2002-04-24 16:26) [21]

Посмотрел теорему Котельникова, если правильно понял, то частота дискретизации в данном случае должна быть 120 Гц.


 
Sergo ©   (2002-04-24 16:30) [22]

Digitman ©
Я думал об этом. У меня есть готовый алгоритм БПФ, его мне дал HeadHanter (одно время он находился здесь, а счас че то не видать) вот его код:
А где здесь частота я че то не найду :((
unit dsp;


interface

type
TWaveHeader = record
Marker1: Array[0..3] of Char;
BytesFollowing: LongInt;
Marker2: Array[0..3] of Char;
Marker3: Array[0..3] of Char;
Fixed1: LongInt;
FormatTag: Word;
Channels: Word;
SampleRate: LongInt;
BytesPerSecond: LongInt;
BytesPerSample: Word;
BitsPerSample: Word;
Marker4: Array[0..3] of Char;
DataBytes: LongInt;
end;



procedure ClassicDirect(Var aSignal, aSpR, aSpI: Array Of single; N:LongInt);
procedure ClassicInverce(Var aSpR, aSpI, aSignal: Array Of single;N:LongInt);


implementation

function Power2(lPower: Byte): LongInt;

begin
Result := 1 Shl lPower;
end;


procedure ClassicDirect(Var aSignal, aSpR, aSpI: Array Of single; N:
LongInt);

var lSrch : LongInt;
var lGarm : LongInt;
var dSumR : single;
var dSumI : single;
begin
for lGarm := 0 to N div 2 - 1 do begin
dSumR := 0;
dSumI := 0;
for lSrch := 0 to N - 1 do begin
try dSumR := dSumR + aSignal[lSrch] * Cos(lGarm * lSrch / N * 2 * PI);
except end;
try dSumI := dSumI + aSignal[lSrch] * Sin(lGarm * lSrch / N * 2 * PI);
except end;
end;
aSpR[lGarm] := dSumR;
aSpI[lGarm] := dSumI;
end;
end;

procedure ClassicInverce(Var aSpR, aSpI, aSignal: Array Of single; N:
LongInt);

var lSrch : LongInt;
var lGarm : LongInt;
var dSum : single;
begin

for lSrch := 0 to N-1 do begin
dSum := 0;
for lGarm := 0 to N div 2 -1
do dSum := dSum + aSpR[lGarm] * cos(lSrch * lGarm * 2 * Pi / N)
+ aSpI[lGarm] * sin(lSrch * lGarm * 2 * Pi / N);

aSignal[lSrch] := dSum/n;
end;
end;


end.


 
Sergo ©   (2002-04-24 16:36) [23]

>VictorT ©
Да ты прав, по теореме частота дискретизации должна вдвое превышать частоту входного сигнала. Но можно ли выставить такую частоту?


 
Sergo ©   (2002-04-24 16:57) [24]

Ну че мне делать то :((


 
VictorT ©   (2002-04-24 17:04) [25]


> Но можно ли выставить такую частоту?

Я думаю, что просто програмно делать задержку и в нужный момент опрашивать звуковуху.


 
Sergo ©   (2002-04-24 17:06) [26]

VictorT ©
Счас попробовал, у меня сразу буфер переполняется и прога виснет, а и вообще мне это ничего не дает.


 
AFROLOV ©   (2002-04-24 17:17) [27]

Не совсем так. Согласно теореме Котельникова частота должна быть не менеечем в 2 раза больше - т.е. не менее 120 Гц. Если у тебя была больше - отлично. Просто ты сразу о параметрах сигнала ничего не сказал.


 
Sergo ©   (2002-04-24 17:20) [28]

Как же высчитать частоту?


 
AFROLOV ©   (2002-04-24 17:35) [29]

Взять любую больше 120 Гц и при которой твоя прога успевает данные обрабатывать.


 
VictorT ©   (2002-04-24 18:20) [30]

Наверное скоро ухожу, так что приведу код, а вы уж без меня решите, подходит он или нет. Я там пообзывал некоторые функции, думаю догадаешься, что имелось в виду.

int value;
int value1 = 0;
int T = GetTime();
while(условие продолжения цикла) {
value = GetSignal();
if (value1 > value) {
Label1->Caption = FloatToStr(GetTime() - T);
T = GetTime();
}
value1 = value;
Wait();
}



 
Sergo ©   (2002-04-25 07:54) [31]

>AFROLOV ©
Я поставил частоту дискретизации 22,5. А как узнать частоту входного сигнала?


 
Sergo ©   (2002-04-25 09:58) [32]

HELP!!!


 
Digitman ©   (2002-04-25 10:10) [33]

22.5кГц - это оч.много для 50Гц.
11кГц - еще куда не шло. Но, насколько мне известно, SB-совместимые карты позволяют выставлять и иные ЧД. Если драйвер карты это позволяет, задай ЧД в диапазоне от 1кгц до 4кГц.

Вот смотри, какой д.б. ход рассуждений и расчетов в данной задаче.
Предположим, ЧД = 1кГц., а ширина фрейма (ШФ, по сути - периодичность измерения вх.сигнала) = 1 сек. При 8-битном монорежиме оцифровки запись длительностью в ШФ секунд потребует 1кб буферной памяти. При этом в буфер будет записана инф-ция о ~ 50-ти периодах вх.сигнала. Это означает, что в полученном при прямом БПФ спектре сигнал частотой в ~ 50 раз превышающей частоту 1Гц (~ 1 / ШФ) , будет представлен ~ 50-й его гармоникой. Амплитуда 50-й гармоники (при том, что вх.сигнал, как ты говоришь, близок к синусоидальному) будет резко отличаться (в общем случае - иметь максимальное значение) от амплитуд прочих гармоник.

Исходя из этого, можно выбрать след.параметры вызова ClassicDirect() :
- aSignal - адрес собственно буфера фрейма;
- размер буфера фрейма N = 1024 (степень двойки !!! на этом базируется вся механика БПФ);
- M = 53 (50 + 3) (выбираемый размер массивов aSpR, aSpI; фактически M - это верхний частотный предел спектра, выше которого частотный анализ нас не интересует в дан.случае)

Результатом работы БПФ будут два заполненных массива aSpR и aSpI, содержащих соотв-но действительные и мнимые составляющие комплексных значений амплитуд упорядоченных (по возрастанию их номеров) гармоник в спектре фрейма вх.сигнала.
Абс. значение ампл-ды k-й гармоники может быть расчитано как aSp[k] = Sqrt(aSpR[k] ^ 2 + aSpI[k] ^ 2). При предполагаемой центральной частоте вх.сигнала ~ 50Гц, можно, проанализировав тем или иным образом некий результ.массив aSp[1..M] (в котором записаны расчитанные по этой формуле абс.зн-я амплитуд гармоник), убедиться, что индекс k максимального элемента массива aSp будет равен 50, что при заданной нами ШФ ~ 1сек. и дает как раз частоту осн.тона сигнала Fвх равной ~50 Гц.

Умешьшив ШФ, к примеру, в 2 раза (ШФ ~ 0.5 сек) для уменьшения периода измерения и, соотв-но, размеров буфера фрейма и массивов aSp, aSpR, aSpI для той же Fвх ~ 50 Гц мы получим иное значение k ~ 50 / 2 ~ 25, но при этом точность измерения, разумеется, понижается из-за особенностей БПФ, связанных с возможностью разложения сигнала в спектр, состоящий только из гармоник с целочисленными номерами.


 
Sergo ©   (2002-04-25 11:20) [34]

У меня родилась идея и я хотел бы посоветоваться:
Я набираю в массив за период времени в 1 сек. значения синусоиды, ищу средених максимальное (амплитудное). Далее считаю количество амплитудных значений за этот период времени - это и будет частота. Конечно от realtime я буду немного отставать.


 
Digitman ©   (2002-04-25 11:51) [35]

>Sergo
Слишком велика будет погрешность и частота сильно "скакать" будет от измерения к измерению. Если вообще получишь правильный результат - гармоники-то возможны, сам же говоришь. Чтобы сие "прокатило", нужно будет содержимое буфера фрейм "прогонять" через ФНЧ перед этим подсчетом, дабы свести до допустимого минимума влияние тех самых гармоник на безошибочность и "плавность" результата. А ФНЧ еще и дополнительную задержку внесет. Плюс - неоптимальность/неэффективность самого алгоритма подсчета (как, впрочем, и в случае с БПФ по приведенному тобой алгоритму в ClassicDirect) : ни MMX ни XMM не используются, а могли бы дать не менее чем 4-хкратное увеличение производительности сквозного тракта программного анализа сигнала.
Поэтому - так или иначе - по-любому рекомендую воспользоваться для своей задачи готовыми реализациями тех или иных выбранных тобой алгоритмов в библиотеке Intel Signal Processing Library v4.x (IntelSPL). Если, конечно, планируешь работу задачи на CPU от Intel. Мощь MMX- и XMM-технологий там задействована "на полную катушку". Есть там все : и векторно/матричные вычисления, и фильтры, и FFT - все, что душе угодно).. Есть в пакете с iSPL и оч.неплохой Делфи5-демо-проект (редкость вообще !), демонстрирующий визуально практически всю функц-ть библиотеки.


 
Sergo ©   (2002-04-25 12:03) [36]

>Digitman ©
Пожалуйта подскажи не битую ссылку на IntelSPL, я много слышал о ней но никак не могу закачать ее.


 
Digitman ©   (2002-04-25 12:18) [37]

http://downloadfinder.intel.com/scripts-df/Product_Filter.asp?ProductID=238

работает, проверено только что.


 
Sergo ©   (2002-04-25 13:10) [38]

>Digitman ©
спасибо


 
Sergo ©   (2002-04-25 15:32) [39]

>Digitman ©
У меня дельфовая демка ругается на nsp.dll не знаешь в чем может быть дело, система ХР?


 
Digitman ©   (2002-04-25 16:20) [40]

>Sergo

И как ругается ?


 
Sergo ©   (2002-04-25 16:34) [41]

>Digitman ©
Говорит: точка входа в процедуру nspWtReconstruct не найдена в библиотеке nsp.dll


 
Sergo ©   (2002-04-25 16:36) [42]

>Digitman ©
Это при компиляции


 
Sergo ©   (2002-04-25 16:40) [43]

>Digitman ©
Все проблема разрешилась, просто я nsp.dll перепутал и в windows/system забросил от другой версии, извини за беспокойство.


 
Sergo ©   (2002-04-26 10:36) [44]

>Digitman ©
Помоги мне пожалуйста еще раз.
Ты говорил что если гармоника одна, то можно обойтись без БПФ, не мог бы ты сказать каким образом?
Буду очень признателен.


 
Digitman ©   (2002-04-26 11:37) [45]

Ну, скажем, вот так :

1. Ищешь все максимумы (Amax) и минимумы (Amin) в буфере фрейма. Разница дает абс. значение амплитуды (Aabs) .(размах вч.сигнала)

2. Ao = Aabs / 2 (среднее значение)

3. Ищешь в буфере фрейма и подсчитываешь (Cnt) все значения выборок, равные (с заданной наперед некоторой абс.погрешностью - гармоники-таки будут обязательно !! Ведь АЦП карты не идеален..), скажем, Amin + Ao. Полученное в Cnt значение отражает общее число пересечений графиком вх.сигнала некоей выбранной тобой "оси X" (при пересечении этой "оси" графиком ф-ции вх.сигнала зн-я ф-ции как бы условно принимаются за "равные нулю")

4. Frel = Cnt / 2 (относительная частота вх.сигнала - число периодов, укладывающееся во фрейме)

5. Получаешь искомый результат :

Fabs = (1 / Tfr) * Frel - приближенное значение абс.частоты вх.сигнала, где Tfr - ширина фрейма, сек


Но ФНЧ все-таки нужен даже в этом случае. Без него погрешность измерения будет заметно большая.


 
Sergo ©   (2002-04-26 13:41) [46]

>Digitman ©
А ФНЧ надо делать электронно или програмнно? Если програмно, не мог бы ты подсказать алгоритм, я просто никогда его не видел.
А на счет расчета частоты, чем отличается твое решение от моего:
Я набираю в массив за период времени в 1 сек. значения синусоиды, ищу средених максимальное (амплитудное). Далее считаю количество амплитудных значений за этот период времени - это и будет частота. Конечно от realtime я буду немного отставать.



 
Digitman ©   (2002-04-26 14:09) [47]

>Sergo

Я вот так и не понял - чем же тебя SPL не устроила-то ? На кой черт, пардон, тебе алгоритм-то ? Фильтра или тем еще чего-то ?Все ж готовое уже есть ! И - уверяю тебя - далеко не самым худшим образом сделанное ... Почему не воспользоватся-то ?


 
Sergo ©   (2002-04-26 14:18) [48]

>Digitman ©
Стыдно признать, но никуда не денешься :))
Она пока сложная для меня, я с плохо понимаю че там делается :))


 
Digitman ©   (2002-04-26 15:16) [49]

>Sergo
Ты - о теории цифровой обработки сигналов вообще ? Так ведь и готовый алгоритм тебе в таком случае не поможет). Думаешь, менгьше вопросов будет ? Все равно же "бомбить" будешь вопросами типа "что это и зачем" в алгоритме ... Так не проще ли взять документацию по той же SPL, почитать внимательно и задавать предметные вопросы по незнакомым терминам и назначениям библиотечных входов/выходов в привязке к теории ?


 
Sergo ©   (2002-04-26 15:49) [50]

>Digitman ©
С той ссылки которую ты мне дал pdf файл не закачивается почему то, если он у тебя есть и тебе не трудно скинь мне его на inoup@diamond.stup.ac.ru.
Нет теория обработки мне знакома, а вот код SPL я плохо понимаю пока.


 
Sergo ©   (2002-04-26 15:54) [51]

Эх мне бы с тобой встретиься и поговорить...мечты-мечты :))


 
Digitman ©   (2002-04-26 16:10) [52]

>Sergo

А на кой тебе отдельный *.PDF - то тащить оттуда ? Качай сразу весь Intel Signal Processing Suite ! В SFX-вормате ! 17 mb всего-то )... там есь все - и PDF, и DOC, и сама DLL, и DPR ... да чего там только нет !)) Было б желание) ...


 
Sergo ©   (2002-04-26 16:14) [53]

>Digitman ©
Извини, моя невнимательность, я то думал они раздельно, я нашел, а перевода к нему не существует?


 
Digitman ©   (2002-04-26 16:35) [54]

>Sergo

Понятия не имею. Меня эта проблема не касается, извини уж


 
Sergo ©   (2002-04-26 16:42) [55]

>Digitman ©
Спасибо тебе



Страницы: 1 2 вся ветка

Текущий архив: 2002.06.03;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.019 c
14-7188
cok
2002-04-25 18:18
2002.06.03
Чё лучше?


4-7256
John Forest
2002-03-26 09:34
2002.06.03
Как отправить клавиатурную комбинацию другому процессу... перерыл форум но так и не нашел ответа...


4-7262
hvs-md
2002-03-31 21:22
2002.06.03
PrinScreen c окна на неактивном рабочем столе.


6-7145
boomer
2002-03-22 22:15
2002.06.03
Как определить IP и Mac адресс компьютеров в локальной сети


3-6891
andysoft
2002-05-11 07:58
2002.06.03
Переустановка BDE