Lowpass filtering an array of waveforms with different cutoff frequencie​s

I'm trying to take an array of waveforms and have seperate filter settings for each individual waveform. For example, I want to have a 2 hz cutoff frequency on my thermocouple inputs and a 100 hz cutoff frequency on a strain gage input.
When I try to accomplish this using the Butterworth filter (as shown in the image) I get weird results. The VI seems to be setup to only handle 1 waveform at a time. If I set the init/cont to F for init, the beginning of each waveform segment is reset to 0 which wrecks the data files. If I set the init/cont to "T" for continuous, the data is completely wrecked because the waveforms are interferring with each other.  Clearly this VI is not setup for muliple instances (for use in a for loop).
There are the Waveform filters, but I seem to only be able to use 1 cutoff frequency for the entire set of waveforms.
In the subVI image below, I input an array of waveforms into a for loop with the settings collection for each channel (element in the waveform array). I pass the cutoff frequency to the butterworth filter with the Y data array from the segment of the waveform.  Waveform data is supplied continuously (I need a live data filter).
Thanks for your input.
Attachments:
Filter applied to multiple waveforms.png ‏17 KB

You are correct (about the true/false on the cont/init input).  Not sure I follow what the help is saying to do...
Is there anyway to verify the number of instanced "Filter Duplicates" are running? I'm still having a lot of issues with my implimentation and I'm wondering if I'm not initializing everything correctly.  I've even added a button that should push a new re-initialization.  I'm trying to have an interface that allows the user to turn off and on the filter while data is be aquired.  Here is some of my code that I'm using to try and accomplish that, but after I've enabled the filter on multiple waveforms and hit my "re-initialize" button I still get bizarre data artifacts (like spikes) that would not be indicative of data on the other side of a low pass filter.  Thanks for any additional feedback.
I've modified your Filter Duplicate to have an "Enable" feature so that the waveforms that I do not want any filtering of are just passed through.
I've tried to re-create the functionality of your Test multi-filter VI Server, but with the added boolean option to not have the filter performed:
So when "True" is on init/cont input the VI is re-open by VI server and the true signal propagates to the Filter Duplicate Asynchronous call.  Here is a snippit from my main window call:
Lastly, here is the noisy data I'm dealing with:
Here is the data after I apply a 5Hz filter to each one:
Clearly data from one is being imposed on the other.  Hitting my "re-initialize" button to send a "true" signal through doesn't fix it.  How can I verify that my filters are working independently as desired?
Thanks!

Similar Messages

  • User event for array of waveforms with attribute

    I have been transferring data in a Producer/Consumer architecture via User Events.  The data consisted of an array of waveforms. When I added an attribute to the waveforms the code breaks with two errors about Create User Event: User event data type is unnamed or has elements with no names or duplicate names, and Contains unwired or bad terminal.
    From reading the help on user events it is not clear that arrays are even allowed: "user event data type is a cluster of elements or an individual element whose data type and label define the data type and name of the user event."
    From experimentation it seems that arrays of numerics and arrays of wavefroms without attributes work. A single waveform with an attribute can also be used. But an array of the same waveform with attribute leads to a broken run arrow. It also appears that I can put the array of waveforms with attributes inside a cluster and then create the user event.
    Is this a bug, an undocumented corner case, or some "feature" that I do not understand?
    Searching for User Event for Array of Waveforms generates some interesting, but mostly irrelevant results.
    Lynn

    tst wrote:
    Another option would be typecasting, but it looks like you can't typecast a waveform. Variant to Data or Coerce to Type might also work, but I haven't tried.
    I have also done the Flatten To String and Unflatten From String to send data around.  It would be preferable to not need to do that though.
    There are only two ways to tell somebody thanks: Kudos and Marked Solutions
    Unofficial Forum Rules and Guidelines

  • How do i change 2 row of array into waveform with delta time and time

    Hello,
    How do i change 2 row of array into waveform with delta time and time
    so the waveform graph will display two waveform,
    waveform, not cluster =]
    and how to extract 1d array from waveform?

    Hi AxE,
    Here is an example VI, that do what You asked for.
    Both requests.
    Hope it Helps...
    Attachments:
    2D_to_Waveform.vi ‏75 KB

  • Array of sliders with different properties possible?

    Hello, I'd like to have an array of sliders with different properties. And since that's not possible simply by creating an array of sliders, are there any workarounds for creating what's in the attached VI?
    The reason for having an array of sliders is so that the user can add multiple elements at run-time, which is something I can't do with clusters, or can I? What about a nice scrollbar to go along with it? I'm particularly interested in the property to change the scale of the sliders so that the user can adjust the scale for each channel on its own. Since different channels are scaled differently, the sliders look a little silly when the values are especially far off.
    Thanks.
    Attachments:
    sliders.vi ‏8 KB

    You can't create an array like that, but you can create cluster that looks exactly the same (you'll need to add an event structure to handle the scrolling and you can set the controls disabled value to 2 to make it act like just like an unused array element). I can write up a working example later if you want.
    Matt W
    Attachments:
    sliders 2.vi ‏14 KB

  • How to generate and output 3 TTL square waveforms with different pulse widths using counters of NI 6034E

    Hello
    I just have a few questions.
     I am using the NI 6034E DAQ board in order to
    generate simultaneouly 3 different TTL digital signals, with different
    pulse width, and output these TTL signals to an external circuit that I
    am using for this application.
    The following pattern of the TTL pulses will look like this:
    01010101 01010101
    00110011 00110011
    00001111 00001111
    From
    what I understand,  I have to use the 2 counters, Ctr0 and Ctr1, to
    generate the TTL pulses that I desire, because the DIO lines are
    software timed only and I will not be able to produce a deterministic
    output period using these DIO lines.  Am I correct?    Also, do I have
    to use a separate counter to generate a separate TTL digital pulse.  I
    need 3 different TTL pulses and there are only 2 counters for this DAQ
    device.  The three generated TTL signals will be feed to an external
    circuit.  Concerning the hardware connections for my application, I
    assume that the generated TTL signals will be output from
    GPCTR0_OUT(pin 2)  for counter 0 and GPCTR1_OUT(pin 40) for counter 1
    of the NI 6034E. Is this correct?  Is there any way that these TTL
    signals can be output from three DIO lines(DIO0...2). 
    Here is some code that I plan to use in order to do this:
     #include <NIDAQmx.h>
    static TaskHandle gTaskHandle = 0;
    DAQmxCreateTask ("", &gTaskHandle);
    DAQmxCreateCOPulseChanTime (gTaskHandle, "Dev1/ctr0", "", DAQmx_Val_Seconds, DAQmx_Val_Low, 1.0, 2.0, 2.0);
    DAQmxCreateCOPulseChanTime (gTaskHandle, "Dev1/ctr1", "", DAQmx_Val_Seconds, DAQmx_Val_Low, 3.0, 4.0, 4.0);
    DAQmxCreateCOPulseChanTime (gTaskHandle, "?????", "", DAQmx_Val_Seconds, DAQmx_Val_Low, 7.0, 8.0, 8.0);
    DAQmxCfgImplicitTiming (gTaskHandle, DAQmx_Val_FiniteSamps, 5);
    DAQmxStartTask (gTaskHandle);
    DAQmxWaitUntilTaskDone(gTaskHandle)
    DAQmxErrChk DAQmxStopTask(gTaskHandle)
    DAQmxErrChk DAQmxClearTask(gTaskHandle)
    I believe this code should generate the 3 TTL square waveforms that I want for my application.
    Please provide me with some feedback.  It would greatly be appreciated.
    Thank You

     Hi,
    The NI 6034E is a multifuntion DAQ device, this means you have:
      (2) counters
      (8) DIO lines (software timed)
      (16) AI, single ended
      (0) Analog Output
     You have a couple choices here:
       1. Software timed digital output of all three signals, max 1khz loop rate, non-deterministic.
       2. Hardware timed digital output of 2 signals, max 20Mhz.
       3. Hardware timed digital output of 2 signals and software timed digital output of 1 signal.
       4. Find another NI MIO board such as the NI 6251. This board will do 10Mhz pattern generation for (8) DIO lines.
    For the hardware connection, you are correct, the output for the counters will be taken from pin 2 & pin 40.  Here's the pinout for the NI 6034E for reference:
    The output of the Counters can be routed to some of the PFI's or to the RTSI connector. You can see this in MAX
    Message Edited by Matthew W on 11-19-2007 01:24 PM
    Attachments:
    2007-11-19_131609.jpg ‏61 KB
    2007-11-19_132435.jpg ‏86 KB

  • Array of buttons with different boolean text ?

    I'm looking for a method of displaying a 2D button matrix with
    different boolean text on each button. It seems an array of booleans
    must all have the same text. Perhaps a cluster could be used, but the
    array makes button alignment easy and easy to determine which had been
    pressed (radiobutton style with only one button true at a time).
    Steve

    On 6 Dec 2002 05:31:21 -0800, [email protected] (humenik) wrote:
    >[email protected] (Steve Parus) wrote in message news:<[email protected]>...
    >> I'm looking for a method of displaying a 2D button matrix with
    >> different boolean text on each button. It seems an array of booleans
    >> must all have the same text. Perhaps a cluster could be used, but the
    >> array makes button alignment easy and easy to determine which had been
    >> pressed (radiobutton style with only one button true at a time).
    >It's easy to make them individuals in a cluster, and on the block
    >diagram use Cluster To Array to get it into array form for
    >manipulation. This can be superior to an array of buttons, not merely
    >because the buttons can thereby have differing colors and text. An
    >array of buttons cannot have the buttons Latched When Pressed; when in
    >a cluster, however, the latching action is available.
    When might that Latched When Pressed behavior be useful ? Using a 2D
    array of buttons (not cluster), in LV 6.1, a Value Changed event for
    the array can be used as you mention below to XOR the event's OldValue
    and NewValue and wire that to a local variable copy of the array.
    This easily gives a radio button effect for the entire 2D button
    matrix. The array control automatcially arranges the visual
    alignment of the buttons.
    For the cluster method, I'd like to programmatically change which
    button is true. All the approaches I come up with end up using
    Array-to-Cluster which then requires the cluster size to be specified.
    I may end up wanting to programmatically vary the number of buttons in
    both dimensions and hence the cluster size. LV's Align Objects and
    Distribue Objects ends up making the button visual alignment not
    difficult (for a 12 x 8 matrix).
    >Try this: take a cluster of four PB's (latched when pressed) put
    >inside a while loop. Initialize a boolean array of 4 to FALSE outside
    >the while loop, and attach it to a shift register input on the left
    >side of loop. Inside the loop, convert your cluster to an array. XOR
    >the shift register with this array from the buttons, and wire this to
    >the output shift register and to an indicator array. Set the boolean
    >to the loop so it will run free and start it up; on the control panel,
    >click on the PB's and you will see the outputs toggle.
    >
    >Greg

  • Multiple waveforms with different start triggers

    I have four waveforms, AO0, AO1, AO2, AO3 - I want to have each waveform start with a different start trigger, PFI3, PFI4, PFI5, PFI6 respectively.  When I attempt it, it says the clock resource is already in use.  How do I share the clock for the different waveforms?
    Can this be done on the NI-6722?
    Thanks
    Bill

    Unfortunately the card doesn't work that way.  You can't trigger the AO lines individually--if you are using hardware timing/triggering the AO lines need to be in the same task and would shave the same sample clock and start trigger.
    Best Regards,
    John Passiak

  • Synchroniz​e two waveforms with different time

    Hi All,
         Thank you again in advance for you help on this. I am trying to create a setup where a spectrum is generated over time (millisecond time range, this function works properly), and a maximum for a peak that I select (this also works correctly) plots over time (minute time scale). However, when I try to run this, the fast plot is operating at about 40 Hz, and I have a calculation to allow a resolution feature for the minute time graph (the fast experiment is averaged a given number of times to produce a spectrum which is then analyzed for the maximum peak, so for example, at 40 Hz, and a resolution of 0.5 seconds, it should need to average 20 spectra for each point), but in operation, the time does not work correctly. At 20 spectra averaged per point, I only get about one point per second, not 2. So, in an attempt to correct this, I cut the averages in half, and was able to get it to work at very nearly 2 spectra per second. However, the time is not exact when compared to an external clock, and I need to know then exact time. Thus, is there any way to have the minute time frame graph count time on its own, and just plot a Y value whenever it recieves one? I need to have it plot in real time, as is currently achieved in the attached vi. In th attached VI, I am working with the "chromatography mode" tab, the other tabs already work correctly. However, I am somewhat new at this, and my code is a bit messy, so I apologize for that in advance. Thank you,
    <>< Eric
    Attachments:
    IMS Software v5.4.vi ‏158 KB

    Hello Eric,
    I see that you are creating a waveform using the Build Waveform VI and then wiring it to the outputs in the Chromatography Mode tab - namely 'Waveform Graph' and 'Waveform Graph 3'. Is the 'dt' value constant for every iteration of the while loop? If so, your output should have constant time spacing between plotted values in the waveform graph.
    So, again I am not completely sure what you mean by the IMS not operating at the frequency you input :-(. Are you seeing the problem in 'Waveform Graph' or 'Waveform Graph 3' or both? An simple example VI would be great to describe your issue.
    Vivek Nath
    National Instruments
    Applications Engineer
    Machine Vision

  • Aligning a Waveform with its post filtered self

    How do you align a waveform with its filtered waveform after you filter it?  I need to create an upper and lower limit using a filtered version of a waveform and then use the resulting limits to test it.
    Attachments:
    LIMIT Testing.vi ‏158 KB

    What behavior are you observing when you say it does not work as advertised?  
    Also, the function that Mikhail is different than the one you are using.  There is an example listed for this function on your computer in this location labview\examples\measure\resample_align_xmpl.llb
    Ryan
    Applications Engineer
    National Instruments

  • How to create an array of ring with a different items/values for each

    Hi All,
    i want an array of text ring with different items and values for each text ring. Do you have other solution if it does not work?
    thanks by advance

    0utlaw wrote:
    Hello Mnemo15,
    The properties of elements in an array are shared across all controls or indicators in an array, so there is no way to specify unique selectable values for different text rings in an array.  It sounds like what you are looking for is a cluster of ring controls, where each control can be modified independently.  
    Could you provide a more descriptive overview of the sort of behavior you are looking for?  Are these ring elements populated at run time?  Will the values be changed dynamically? Will the user interact with them directly?
    Regards,
    But the selection is not a property, it is a value... I just tried it and you can have different selections.  Just not different items.
    Bill
    (Mid-Level minion.)
    My support system ensures that I don't look totally incompetent.
    Proud to say that I've progressed beyond knowing just enough to be dangerous. I now know enough to know that I have no clue about anything at all.

  • Plot a bar graph of 1D array with different color of each bar?

    Any one has example for a graph of 1 D array ( exp: [1,2,6,4,6]  with different color of each bar? I want to make a bar graph of 1 D array, exp :if the value >=5, the bar is red, value< 5 is blue.

    What's wrong with the solution I showed you over two weeks ago?
    http://forums.ni.com/ni/board/message?board.id=170&view=by_date_ascending&message.id=281455#M281455
    LabVIEW Champion . Do more with less code and in less time .

  • Spatial overlay queries involving tables with different spatial extents

    We are using GeoMedia Professional 6.1 with an Oracle 10g database. For validating geometry, we use a standard minimum bounding rectangle (MBR) that is fairly tight to our city boundary. Some city departments are requesting that we extend the spatial limits to create a larger MBR for some new features. This will involve using a new SDO_DIMINFO array in the MDSYS.SDO_GEOM_METADATA_TABLE and creating new spatial indexes. It is our intention to leave the existing features "as-is" with the original MBR and spatial indexes. I have done some preliminary testing in GeoMedia and have not run into any issues when doing spatial queries involving features with different MBRs. Spatial intersections, spatial differences and spatial filters seem to complete in a reasonable amount of time, even with large data sets. Does anyone have any experience using different MBRs with Oracle spatial overlay queries? Are there any other potential issues we should be aware of when working with tables that are created with different spatial extents such as performance?

    Luc ... Thank you for supplying the URL for Simon Greener’s website. This article supports information we already received from our GIS software provider.
    With regards to your questions: One of the checks carried out in our “ValidateGeometry” procedure is to ensure that a new or modified geometry is within the bounding rectangle defined by the SDO_DIMINFO. An error is raised if the user tries to add a polygon that is well beyond the city boundary rather than within the prescribed city area. Currently, we do not use different MBR’s as layer extents (there are only a couple of exceptions). We are in the process of conducting system and performance testing to identify potential issues that may be encountered when tables created with expanded upper and lower bounds are used in downstream applications such as intranet/internet web maps. We are still trying to identify any potential “hotspots”.

  • How to sample a data input waveform with a trigger input waveform

    Hi,
    I am using the NI USB-5132 digitizer to receive two inputs: one is an analog data waveform and one is a digital trigger waveform.
    Is there a way to generate a third waveform/array of data that corresponds to the data waveform being sampled only once per rising edge of the trigger input?
    -Thanks

    Timothy,
    First of all thanks for the reply, I've been really busy this last week and haven't been able to reply.
    Right now I have my data signal on channel 0 of the NI USB-5138, and I have the trigger on channel 1.  I have attached two corrections of how the signals look coming in (one is zoomed out, one is zoomed in, trigger is the red one the zoomed in one).  The trigger signal has 128 square pulses per scan that correspond to the time that I would like to sample 128 different high values for the data input.  I also have a 3rd input which has a falling edge for the start of each scan. As you can see in the zoomed out waveform graph, the data input consists of consecutive scans of data. 
    My end goal would be to process the data so that I have 128 different arrays of 10-20 data points (each data point represents a different scan), with each of the 128-array corresponding to a different element in the 128-long scan, and how it has changed over time.  So for example, if the data at array location 3 changes from 0 V at scan t0 to 2.5 V at scan t1, then back down to 0 V at scan t2, then I would like to have an array that looks like:
    Array of data for location[3]
    Time:         t0    t1     t2
    Voltage:     0     2.5   0
    My biggest challege has been setting up these arrays.  Would it be best to capture 10-20 scans using the 'Acquire N Samples', and then do post processing?  I also experimented with the PtbyPt VIs, which seem interesting because I would like to do as much of my work in real time as possible, but I'm not too familiar with these or with Labview.
    Any help would be much appreciated.
    -Ddetone
    Attachments:
    zoomedOut.JPG ‏213 KB
    zoomedIn.JPG ‏242 KB

  • Cube with different reports data

    Hi
    We have 3 different Reports based on a Multi which has only one Infocube.
    We have new design policy that any New different report that needs to be created should be based only on this Multi and all data should be loaded only into this only infocube on which this Multi is based.
    So for the existing 3 reports,we have three different database views in source database.Fullload will be done from source every weekend(previous week's request will be deleted every week) of snapshot data into three different DSOs from these three different datasources.(Its new policy that every report should have its own DSO ).All these 3 DSOs should be connected to only one cube on which our reporting Multiprovider is based.So from these 3 DSOs,data will be loaded into cube in fullload every weekend(previous week's request will be deleted)
    Now my question is:
    1.when all the data is going to cube from three different views and DSOs(with different keyfigures but some same characteristics in 3 DSOs),how can our 3 different reports pick data that is relevant for it when all data is pooled together in one big cube?Doesnot aggregation happens?
    (When a report is run,does OLAP processor goes into cube and picks only those keyfigures and characteristics in cube thats relevant for that report and by that way,avoids other data??)
    2.I need to create one new report.For this I need to create one new view and one new DSO.So,data will be loaded from view to DSO and this DSO will be connected to existing cube(new dataflow until cube from source view).But our cube doesnot contain one keyfigure.It contains all other characteristics and keyfigures from DSO.
           a)How can I add this new keyfigure from new DSO to cube without disturbing existing data in cube.I donot need to load historical data for this new keyfigure and new report.
          b)I am going to transport this from development.So what care do I need to take while transporting changes to Production cube which contains lots of data and many reports running on it?
    Thanks.

    *1.when all the data is going to cube from three different views and DSOs(with different keyfigures but some same characteristics in 3 DSOs),how can our 3 different reports pick data that is relevant for it when all data is pooled together in one big cube?Doesnot aggregation happens?
    (When a report is run,does OLAP processor goes into cube and picks only those keyfigures and characteristics in cube thats relevant for that report and by that way,avoids other data??)*
    It will depend on what Key Figures you are displaying in your report. If a KF is coming from only 2 DSOs, data from those 2 DSOs will be displayed.  And you are right in saying that OLAP processor will pick only releavnt KFs and Characteristics but it will not filter based on characteristic value e.g. if a characteristis is coming only from DSO 1 and not from DSO2, but KF is coming from both, so for the data in DSO 2 that characteristic will be displayed as #. If you want to filter data, you can put filters in the report.
    Another good option can be to store the DSO name as a characeteristic in your cube, it might be helpful if you want to make a reprot based on data from a particular DSO, then you can put the filter based on DSO name.
    *2.I need to create one new report.For this I need to create one new view and one new DSO.So,data will be loaded from view to DSO and this DSO will be connected to existing cube(new dataflow until cube from source view).But our cube doesnot contain one keyfigure.It contains all other characteristics and keyfigures from DSO.
    a)How can I add this new keyfigure from new DSO to cube without disturbing existing data in cube.I donot need to load historical data for this new keyfigure and new report.
    b)I am going to transport this from development.So what care do I need to take while transporting changes to Production cube which contains lots of data and many reports running on it?*
    You are adding a new KF which is coming only from new DSO, so you do not need to worry about a lot of things, you can move your changes to procudtion and load data from this new DSO. Data which is already there in the cube will not be impacted.
    Regards,
    Gaurav

  • How to structure the DMA buffer for PXie 6341 DAQ card for analog output with different frequencies on each channel

    I'm using the MHDDK for analog out/in with the PXIe 6341 DAQ card.
    The examples, e.g. aoex5, show a single Timer  (outTimerHelper::loadUI method), but the example shows DMA data loaded with the same vector size.
    There is a comment in the outTimerHelper:rogramUpdateCount call which implies that different buffer sizes per channel can be used.
       (the comment is: Switching between different buffer sizes will not be used)
    Does anyone know what the format of the DMA buffer should be for data for multiple channels with different frequencies ?
    For example, say we want a0 with a 1Khz Sine wave and a1 with a 1.5Khz sine wave.  What does the DMA buffer look like ?
    With the same frequency for each channel, the data is interleaved, e.g.  (ao0#0, ao1#0; ao0#1, ao1#1, ...), but when the frequencies for each channel is different, what does the buffer look like ?

    Hello Kenstern,
    The data is always interleaved because each card only has a single timing engine for each subsystem.
    For AO you must specify the number of samples that AO will output. You also specify the number of channels. Because there is only one timing engine for AO, each AO will channel will get updated at the same time tick of the update clock. The data will be arranged interleaved exactly as the example shows because each AO channel needs data to output at each tick of the update clock. The data itself can change based on the frequency you want to output.
    kenstern wrote:
    For example, say we want a0 with a 1Khz Sine wave and a1 with a 1.5Khz sine wave.  What does the DMA buffer look like ?
    With the same frequency for each channel, the data is interleaved, e.g.  (ao0#0, ao1#0; ao0#1, ao1#1, ...), but when the frequencies for each channel is different, what does the buffer look like ?
    In your example, you need to come up with an update rate that works for both waveforms (1 KHz and 1.5 KHz sine waves). To get a good representation of a sine wave, you need to update more than 10x as fast as your fastest frequency...I would recommend 100x if possible.
    Update Frequency: 150 KHz
    Channels: 2
    Then you create buffers that include full cycles of each waveform you want to output based on the update frequency. These buffers must also be the same size.
    Buffer 1: Contains data for the 1 KHz sine wave, 300 points, 2 sine wave cycles
    Buffer 2: Contains data for the 1.5 KHz sine wave, 300 points, 3 sine wave cycles
    You then interleave them as before. When the data is run through the ADC, they are outputting different sine waves even though the AO channels are updating at the same rate.

Maybe you are looking for

  • Ipad 2 and sound on a projector

    I connect and mirror powerpoint using HDMI to VGA. I get no sound from the setup. Do I need a cable for sound? It is an older projector and there is no wireless

  • Deleting old messages in Messages Beta

    On the iPad and iPhone, deleting old messages is easy. On Mac, the "cut" key is inactive and whatever I do (including deleting iChat files storing messages) old messages keep coming back every time opening Messages Beta. How do I get rid of them once

  • Include LMEDRUCKF1G - Print PO

    Hi All The Include LMEDRUCKF1G has the following code bundle. select single * from t006a where spras eq ekko-spras                              and   msehi eq ekpo-meins. move t006a to *t006a. My problem is that a certain UOM = 'CT' (Carton) is being

  • How to install iphone and Android Apps in Mobiles

    I would like to install top Indian social network "bharatstudent.com" [www.bharatstudent.com/bsmobile.php#1] iphone apps, android apps in my mobile. But I am unable to understand that procedure, If you have any idea about installation of apps in mobi

  • Plug-Ins for Safari and Firefox

    I'm a new MAC owner (as of last week as a matter of fact) so bear with me....... I had to download Firefox since I got the message that Safari didn't support the new Yahoo Mail Beta. Then I decided to check out my MACBook Pro's video capabilities by